2017-02-11 11 views
0

나는 extends BroadcastReceiver 클래스가 jsoup로 웹 사이트를 먼저 읽은 다음 알림을 보내고 싶습니다. jsoup가있는 부분은 AsyncTask이므로 알림 코드는 AsyncTask onPostExecute 부분에 있어야하지만 Alarm 또는 Calendar 코드에서 지정한 시간에 앱이 다운됩니다.안드로이드 : Asynctask에서 알림 보내기 -> 충돌

알림 코드가 extends AsyncTask 인 클래스에 있지 않으면 extendsBroadcastReceiver 클래스의 코드가 작동합니다. 로그 캣에서

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

:

지금의 NotificationClass의 코드

내가 앉아 : 나는 충돌을 발견하는 방법

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 has stopped"메시지가 표시되지 않고 작동하지만 알림이 있습니다.

미리 감사드립니다.

+1

여기에 오류 로그를 게시하십시오. –

+0

로그를 표시하십시오. 왜 방송 수신기를 사용하고 싶습니까? – xFighter

+0

충돌 로그가 내 추측을 확인하는 데 도움이되지만이 경우 'siteText'는 null이어야합니다. – Darpan

답변

0

변수가 null입니다. 이것을 시도하십시오

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

감사합니다. specialContext가 loadText에서 사용되므로 loadText가 다른 클래스이므로 여전히 오류가 있습니까? – quidproquo

+0

나는 그것을 시험해 보았다 ->이 경우 나는 어떤 외모도 보지 않는다. – quidproquo