我有一个简单的主要活动,它包含一个更新时间并将其显示在UI上的线程。这是:
final Runnable runnableTime = new Runnable() {
@Override
public void run() {
{
Date d = new Date();
CharSequence timeString = DateFormat.format(
"hh: mm: ss -- d/MM/yyyy ", d.getTime());
infoEntries.get(0).setDetails((String) timeString);
c2_adapter.notifyDataSetChanged();
System.out.println(timeString);
handler.postDelayed(this, 1000);
}
}
};
handler.post(runnableTime);
现在我的问题是当我使用这种方法重启活动时:
public void restart() {
finish();
startActivity(getIntent());
}
活动重新启动就好了,但我现在在后台运行了2个相同的线程,并且不再在UI上更新时间。
我尝试创建自己的Runnable,为我扩展Runnable,以便能够在重启时终止runnable。但这只会引发更多问题。
我以这种方式覆盖了这些方法:
public void restart() {
finish();
startActivity(getIntent());
}
@Override
public void onResume(){
super.onResume();
handler.post(runnableTime);
}
@Override
public void onPause(){
super.onPause();
handler.removeCallbacks(null);
}
这是在on create方法中调用的时间项,也在teh timer ^:
中 Date d = new Date();
CharSequence timeString = DateFormat.format("hh: mm: ss -- d/MM/yyyy ",
d.getTime());
infoEntries.add(new ConsoleItem((String) timeString));
有人有解决方案吗?
提前感谢您的时间:)
答案 0 :(得分:0)
首先,你没有任何线程(只有ui线程)。 其次,如果你开始做某事,你应该把它停在某个地方。
所以,将此handler.post(runnableTime);
移动到Activity的onResume方法,并在Pause方法上将handler.removeCallbacks(runnableTime);
添加到Activity。
答案 1 :(得分:0)
根据@blackbelt的回答
您的活动中的会覆盖onPause方法
@override
public void onPause()
{
handler.removeCallbacks(runnableTime );
}
答案 2 :(得分:0)
由于您丢失了对UI的引用,因此UI中的时间未更新。此外,最好在run方法中使用sleep()进行while循环,以处理时间进度,并在onPause()活动上退出while循环。例如,它可能是
boolean running = false;
while (running) {
// TODO do your stuff
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
开始计算电话之前
running=true;
和活动onPause()
running=false;
通过这种方式,您将处理何时启动runnable,它将在活动暂停/
上停止