2016-10-28 3 views
0

У меня есть фрагмент, в котором таймер запускается сразу после инициализации, и он отображает другое изображение каждые 6 секунд.Остановить таймер фрагмента onCloseActivity

Я не до конца понял, как работает этот таймер вещь, но почему-то я получил это работает, и я понимаю, пробеги таймера в другом потоке ... даже не уверен, что именно это означает, что:)

Но таймер вызывает сбой при загрузке другого фрагмента. так что я думаю, мне нужно ОТМЕНА таймера, когда активность закрыта?

Это подводит меня к двум вопросам. 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" Что такое линия 92 событийFragment.java? –

+0

Ответ Санджейта верен. Вы также можете проверить, является ли текущий контекст NULL или нет, прежде чем вызывать метод nextImage(). Я думаю, вы можете использовать if (getApplicationContext()! = Null) для этой цели. –

ответ

1

Вы можете использовать методы жизненного цикла фрагмента для остановки таймера.

Переопределить метод onStop() во фрагменте и затем отменить задачу таймера внутри этого метода.

@Override 
public void onStop() { 
    super.onStop(); 
    if(timerTask != null){ 
     timerTask.cancel(); 
     //cancel timer task and assign null 
    } 
} 
Смежные вопросы