2017-02-11 67 views
0

我想要extends BroadcastReceiver首先用jsoup讀取一個網站然後(檢查某些東西然後)發出通知的類。 因爲具有jsoup的部分需要AsyncTask,所以通知代碼需要位於AsyncTask onPostExecute部分,但應用程序會在AlarmCalendar代碼給出的時間崩潰。Android:在Asynctask中發送通知 - >崩潰

extendsBroadcastReceiver如果通知碼不在extends AsyncTask的類中,該類的代碼將起作用。

這是NotificationClass的現在的代碼:

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++; 
     } 
    } 
}} 

從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 

我如何發現崩潰:

我坐日曆的時間與某事有關然後運行應用程序,並在虛擬設備上彈出並觀察後關閉它。 此方法沒有使用AsyncTask,也沒有顯示消息:「HPG Vertretungsplan已停止」,但收到通知。

在此先感謝。

+1

在此處發佈您的崩潰日誌 –

+0

向我們顯示日誌。爲什麼你想使用廣播接收機? – xFighter

+0

我猜這是'siteText',在這種情況下應該爲null,儘管崩潰日誌有助於確認我的猜測。 – Darpan

回答

0

SpecialContext變量爲空。試試這個

SpecialContext = getActivity(); 
+0

謝謝; 「無法重新調整方法'getActivity()'」 – quidproquo

1

您的specialContext尚未分配。在onReceive將specialContext分配給傳入上下文

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

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

謝謝;在loadText中使用了specialContext,所以不會出現錯誤,因爲loadText是不同的類? – quidproquo

+0

我試過了 - >在這種情況下,我沒有看到任何外觀 – quidproquo