quidproquo
quidproquo

Reputation: 27

Android: send Notification in Asynctask -> crash

I want the class that extends BroadcastReceiver to first read a website with jsoup and then (check something and then) send out a notification. Because the part with jsoup requires an AsyncTask, the notification code needs to be in the AsyncTask onPostExecute part i guess, but the app crashes at the time given from the Alarm or Calendar code.

The code from the class that extends the BroadcastReceiver works if the notification code is not in the class that extends AsyncTask.

This is the code of the NotificationClass for now:

public class NotificationClass extends BroadcastReceiver{

Context specialContext;
int MID = 1;
long when = System.currentTimeMillis();
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

    new loadText().execute();
}
public class loadText extends AsyncTask<Void, Void, Void>
{
    String siteText;

    @Override
    protected Void doInBackground(Void... params) {

        Connection.Response res = null;
        try {
            res = Jsoup.connect("http://www.hpg-speyer.de/vertretungsplan/")  // Link der Hauptseite, wo auch der Login ist
                    .data("authid", "22101999AzaKur", "authpw", "451d28")  // Hier wären dann die Daten eingetragen
                    .method(Connection.Method.POST)
                    .execute();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            Document doc = res.parse();
        } catch (Exception e) {
            e.printStackTrace();
        }
        String sessionId = res.cookie("PHPSESSID");    // Name des Cookies


        Document doc2 = null;
        try {
            doc2 = Jsoup.connect("http://www.hpg-speyer.de/vertretungsplan/")  // das wäre der Link zu den Feldern
                    .cookie("PHPSESSID", sessionId)
                    .get();
            siteText = doc2.text();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        NotificationManager notificationManager = (NotificationManager) specialContext
                .getSystemService(Context.NOTIFICATION_SERVICE);

        Intent notificationIntent = new Intent(specialContext, MainActivity.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(specialContext, 0,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder mNotifyBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(
                specialContext).setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Alarm Fired")
                .setContentText("Events To be PErformed").setSound(alarmSound)
                .setAutoCancel(true).setWhen(when)
                .setContentIntent(pendingIntent)
                .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});

        if (siteText.contains("something")) {
            notificationManager.notify(MID, mNotifyBuilder.build());
            MID++;
        }
    }
}}

from the logcat:

02-11 12:47:40.626 5413-5413/? I/art: Not late-enabling -Xcheck:jni (already on)
02-11 12:47:40.626 5413-5413/? W/art: Unexpected CPU variant for X86 using defaults: x86
02-11 12:47:40.708 5413-5413/de.kurt.vertretungsplan W/System: ClassLoader referenced unknown path: /data/app/de.kurt.vertretungsplan-1/lib/x86
02-11 12:47:40.711 5413-5413/de.kurt.vertretungsplan I/InstantRun: Instant Run Runtime started. Android package is de.kurt.vertretungsplan, real application class is null.
02-11 12:47:40.988 5413-5413/de.kurt.vertretungsplan W/System: ClassLoader referenced unknown path: /data/app/de.kurt.vertretungsplan-1/lib/x86
02-11 12:47:41.061 5413-5413/de.kurt.vertretungsplan W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
02-11 12:47:41.125 5413-5445/de.kurt.vertretungsplan D/NetworkSecurityConfig: No Network Security Config specified, using platform default
02-11 12:47:41.218 5413-5447/de.kurt.vertretungsplan I/OpenGLRenderer: Initialized EGL, version 1.4
02-11 12:47:41.218 5413-5447/de.kurt.vertretungsplan D/OpenGLRenderer: Swap behavior 1
02-11 12:47:41.248 5413-5447/de.kurt.vertretungsplan E/EGL_emulation: tid 5447: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
02-11 12:47:41.248 5413-5447/de.kurt.vertretungsplan W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x9c73fe80, error=EGL_BAD_MATCH

How I noticed the crash:

I sat the time of the calendar to something relative near, then ran the app and closed it after it popped up on the virtual-device and observed. This method worked without the AsyncTask and without the displayed message: "HPG Vertretungsplan has stopped" but with the notification.

Thanks in advance.

Upvotes: 0

Views: 1339

Answers (2)

Clasence
Clasence

Reputation: 191

Your specialContext is not assigned yet. In onReceive assign specialContext to incoming context

public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub

specialContext=context;
new loadText().execute();}

Upvotes: 1

Aditya Desai
Aditya Desai

Reputation: 425

SpecialContext variable is null. Try this

SpecialContext = getActivity();

Upvotes: 0

Related Questions