2016-10-28 7 views
0

私は、初期化するとすぐにタイマーが起動し、6秒ごとに別のイメージを表示する断片があります。停止フラグメントタイマーonCloseActivity

私は完全にこのタイマーの事は動作しますが、どういうわけか私はそれを実行してしまったと私は...別のスレッドでまさにそれが何を意味するのかさえわからないタイマーの実行を理解する方法を考え出したていない

:)

しかし、私は別のフラグメントをロードすると、タイマーがクラッシュします。だから私は、アクティビティが閉じられたときにタイマーをキャンセルする必要があると思いますか?

これは私に2つの質問をもたらします。 1)どこからでもmyTimer.cancelを実行できますか?はいの場合は、メインアクティビティや他のフラグメントからどのように実行しますか?

2)がこのフラグメントに使用できるonCloseActivityのようなものがあります。私はフラグメントを残すとすぐに私のタイマーをキャンセルできますか?

これは私が私のタイマーを起動する方法です:

//タイマー タイマーmyTimer。 。

///////////////////// 
/////// timer /////// 
///////////////////// 
private void runTimer() { 

    myTimer = new Timer(); 
    myTimer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      TimerMethod(); 
     } 

    }, 5000, 5000); 
} 

private Runnable Timer_Tick = new Runnable() { 
    public void run() { 

     // next image if THIS one is loaded 
     nextImage(); 
    } 
}; 

private void TimerMethod() { 
    getActivity().runOnUiThread(Timer_Tick); 
} 

そして、ここでは私のエラーです: getActivity()runOnUiThread(Timer_Tick)。 は、別のフラグメントをロードするとエラーが発生します。

E/AndroidRuntime: FATAL EXCEPTION: Timer-1 Process: com.murmurcalgary.murmurcalgaryevolvd, PID: 8668 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' on a null object reference at com.murmurcalgary.murmurevolvd.fragments.EventsFragment.TimerMethod(EventsFragment.java:92) at com.murmurcalgary.murmurevolvd.fragments.EventsFragment.access$000(EventsFragment.java:45) at com.murmurcalgary.murmurevolvd.fragments.EventsFragment$1.run(EventsFragment.java:77) at java.util.Timer$TimerImpl.run(Timer.java:284)

+0

"EventsFragment.java:92" EventsFragment.javaの92行とは何ですか? –

+0

Sanjeetの答えは正しいです。 nextImage()メソッドを呼び出す前に、現在のContextがNULLかどうかを確認することもできます。あなたはその目的のためにif(getApplicationContext()!= null)を使うことができると思います。 –

答えて

1

フラグメントのライフサイクルメソッドを使用して、タイマーを停止できます。

フラグメント内でonStop()メソッドをオーバーライドし、そのメソッド内のタイマータスクをキャンセルします。

@Override 
public void onStop() { 
    super.onStop(); 
    if(timerTask != null){ 
     timerTask.cancel(); 
     //cancel timer task and assign null 
    } 
}