Reputation: 27
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
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
Reputation: 425
SpecialContext variable is null. Try this
SpecialContext = getActivity();
Upvotes: 0