我有一个片段,当你初始化时,计时器立即开始运行,并且每隔6秒显示一个不同的图像。
我还没有完全弄清楚这个计时器是如何工作的,但不知怎的,我让它运行了,我明白计时器运行在一个不同的线程......甚至不确定究竟是什么意思:)
但是当我加载不同的片段时,计时器会导致崩溃。所以我想我必须在活动结束时取消计时器?
这让我有两个问题。 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:致命异常:Timer-1 过程:com.murmurcalgary.murmurcalgaryevolvd,PID:8668 java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' at com.murmurcalgary.murmurevolvd.fragments.EventsFragment.TimerMethod(EventsFragment.java:92) 在com.murmurcalgary.murmurevolvd.fragments.EventsFragment.access $ 000(EventsFragment.java:45) 在com.murmurcalgary.murmurevolvd.fragments.EventsFragment $ 1.run(EventsFragment.java:77) 在java.util.Timer $ TimerImpl.run(Timer.java:284)
答案 0 :(得分:2)
您可以使用片段的生命周期方法来停止计时器。
覆盖片段中的onStop()方法,然后取消该方法中的计时器任务。
@Override
public void onStop() {
super.onStop();
if(timerTask != null){
timerTask.cancel();
//cancel timer task and assign null
}
}