0

Meine App hat in letzter Zeit einige Abstürze bekommen, und ich frage mich, ob es an den Flags auf den Absichten liegen könnte.Android App Absturz .. Absicht Flagge?

Wenn der Absturz passiert, wird die App geschlossen, glaube ich, während eines Ruhe-Timers. Ein Fragment wird geöffnet, und der Benutzer kann auf Start klicken, wodurch ein Countdown von 90 Sekunden gestartet wird. Der Benutzer erhält eine Benachrichtigung, wenn der Timer endet, und wenn er angeklickt wird, sollte er den Benutzer zu dem offenen Fragment zurückbringen. Der Fehler tritt nicht oft auf, ich kann ihn nicht jedes Mal neu erstellen.

Hier wird der Stacktrace ist:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
at android.content.ComponentName.<init>(ComponentName.java:77) 
at android.content.Intent.<init>(Intent.java:4913) 
at com.bestworkouts.sheikoworkout.Workouts.Week1Mon.showNotification(Week1Mon.java:171) 
at com.bestworkouts.sheikoworkout.Workouts.Week1Mon$1.onFinish(Week1Mon.java:147) 
at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:127) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:6938) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

und hier ist die Benachrichtigung, wo der Fehler (es sagt der Fehler bei Intent Absicht ist = new Intent (getActivity(), MyWorkout.class):

public void showNotification() { 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext()); 
    builder.setSmallIcon(R.drawable.sheikoicon); 
    builder.setContentTitle("Sheiko Rest Timer"); 
    builder.setContentText("Rest timer is up, start your set!"); 
    builder.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE); 
    builder.setAutoCancel(true); 
    Intent intent = new Intent(getActivity(), MyWorkout.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(getContext()); 
    stackBuilder.addParentStack(MyWorkout.class); 
    stackBuilder.addNextIntent(intent); 
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
    builder.setContentIntent(pendingIntent); 
    NotificationManager NM = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE); 
    NM.notify(0, builder.build()); 
} 

Wo ich den Countdown zu starten und rufen showNotification:

private void start() { 
    cancel(); 
    mCountDownTimer = new CountDownTimer(90000, 1000) { 
     @Override 
     public void onTick(long millisUntilFinished) { 
      txtViewRest.setText(millisUntilFinished/1000 + " Secs"); 
     } 

     @Override 
     public void onFinish() { 
      txtViewRest.setText("Start!"); 
      showNotification(); 
     } 
    }.start(); 
} 

ich frage mich, wenn ich Hat das etwas mit meinem FLAG_ACTIVITY_CLEAR_TOP zu tun?

Vielen Dank für Ihre Hilfe!

+1

Ihr Code scheint in einem' CountDownTimer' zu laufen, könnte es sein, dass 'getActivity()' 'null' zurückgibt, weil es von einem anderen Thread aufgerufen wird? – MohanadMohie

+0

Vielleicht bin ich ziemlich neu in Android, aber ich habe den Code hinzugefügt, wo ich den Timer starte und showNotification-Methode aufrufen, wenn das hilft – LBJ33

+0

Wie @MohanadMohie sagte, Sie sind innerhalb des CountDownTimer-Kontext, so wird getActivity() Null zurückgeben dieser Fall. Sie sollten den Aktivitätskontext an die showNotification() -Methode übergeben. – Shadesblade

Antwort

1

Da Ihr Code auf einem anderen Thread ausgeführt wird, wenn durch die Zeit, die CountDownTimer die Fragment aus irgendeinem Grund geschlossen wurde beendet ist, sowohl getActivity() und getContext()null zurück.

Sie sollen Ihren Kontext in den Fragment ‚s onCreate sparen:

private Context context; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    context= getContext(); 

    // Your code here 

} 

dann verwenden, in in Ihrer showNotification() Methode:

public void showNotification() { 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
    builder.setSmallIcon(R.drawable.sheikoicon); 
    builder.setContentTitle("Sheiko Rest Timer"); 
    builder.setContentText("Rest timer is up, start your set!"); 
    builder.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE); 
    builder.setAutoCancel(true); 
    Intent intent = new Intent(context, MyWorkout.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
    stackBuilder.addParentStack(MyWorkout.class); 
    stackBuilder.addNextIntent(intent); 
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
    builder.setContentIntent(pendingIntent); 
    NotificationManager NM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    NM.notify(0, builder.build()); 
} 
+0

Danke für Hilfe. Leider immer noch den Absturz. Ich bin in der Lage, es jetzt zu reproduzieren, indem Sie den Zurück-Knopf dank Ihnen drücken, der große Hilfe ist. Ich habe getan, wie du es ohne Erfolg gezeigt hast. Die Hauptklasse der Seite prüft die übergebene Intention, abhängig von der Absicht erstellt sie einen Viewpager mit verschiedenen Seiten. Jede Seite hat eine separate Klasse, die den Viewpager mit Daten füllt. Es scheint nur zu stürzen, wenn ich die Zurück-Taste drücke, wenn ich zu anderen Orten in der App navigiere, oder es schließe, funktioniert es richtig – LBJ33

+0

Ich glaube, die Anwendung stürzt jetzt ab, weil Sie versuchen, 'TextView.setText()' aufzurufen während das "Fragment" zerstört wird, was ein anderer Fehler ist als der vorherige. – MohanadMohie

+0

der Stacktrace sagt immer noch java.lang.NullPointerException: Versuch, virtuelle Methode 'java.lang.String android.content.Context.getPackageName()' auf eine Null-Objekt-Referenz – LBJ33