0

最近、アプリケーションのクラッシュが発生しています。インテントのフラグが原因である可能性がありますか?Androidアプリクラッシュ..意図フラグ?

クラッシュが発生すると、休憩時間中にアプリが閉じられたと思います。フラグメントが開かれた後、ユーザーは開始をクリックして90秒のカウントダウンタイマーを開始することができます。タイマーが終了すると、ユーザーは通知を受け取ります。タイマーがクリックされると、ユーザーは開いたフラグメントに戻ります。エラーは頻繁に起こることはなく、毎回それを再現することはできません。ここで

がスタックトレースです:

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) 

、ここでエラーが通知される(それはエラーがテントの意図=新しいテント(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()); 
} 
私はカウントダウンタイマーを起動し、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(); 
} 

をFLAG_ACTIVITY_CLEAR_TOPに何か関係がありますか?

ありがとうございました!

+1

、 'getActivity()'が別のスレッドから呼び出されているので 'null'を返している可能性がありますか? – MohanadMohie

+0

おそらく、私はかなりAndroidに慣れていますが、私はタイマーを起動してshowNotificationメソッドを呼び出すコードを追加しました。 – LBJ33

+0

@MohanadMohieのように、あなたのCountDownTimerのコンテキスト内にあるので、getActivity()はnullを返しますこの場合。アクティビティのコンテキストをshowNotification()メソッドに渡す必要があります – Shadesblade

答えて

1

あなたのコードが別のスレッドで実行されているので、時間によってCountDownTimerFragmentが何らかの理由で閉鎖されている終了した場合、getActivity()getContext()の両方がnullを返します。

あなたはFragmentonCreateであなたのコンテキストを保存する必要があります。

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

    context= getContext(); 

    // Your code here 

} 

次に、あなたのshowNotification()メソッド内にそれを使用します。あなたのコードは `CountDownTimer`内部で実行しているようだ

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

ありがとうございました。残念ながらまだクラッシュしています。私は今あなたのおかげでバックボタンを押すことでそれを再現することができます。これは大きな助けになります。あなたが役に立たなかったように私はやった。ページのメインクラスは、インテントに渡されたインテントをチェックし、インテントに応じて、異なるページのビューページを作成します。各ページには、ビューページにデータを取り込む別のクラスがあります。それは、アプリケーションの他の場所に移動するか、またはそれを閉じて、それが正常に動作する場合、私は戻るボタンを押すとクラッシュするように思えます – LBJ33

+0

私は 'TextView.setText()'を呼び出そうとしているので、 'Fragment'は破壊されますが、これは前のエラーとは異なるエラーです。 – MohanadMohie

+0

スタックトレースにはまだjava.lang.NullPointerExceptionがあります:ヌルオブジェクト参照で仮想メソッド 'java.lang.String android.content.Context.getPackageName()'を呼び出そうとしています – LBJ33

関連する問題