Android UI更新线程-保存和恢复它

6

我应该怎么做才能正确地完成这个任务?

我有一个秒表,它的状态保存在onSaveInstance中,恢复状态保存在onRestoreInstance中...

现在我遇到了以下问题:如果我在onSaveInstance停止线程,屏幕被锁定或关闭,onRestoreInstance就不会被调用,秒表就无法继续运行...
如果我不停止它,则即使屏幕关闭或活动不再处于活动状态,秒表也会一直在后台运行...

那么通常处理这种情况的方法是什么呢?

附注:
我甚至有一个可行的解决方案,在onStop事件中保存运行状态的本地变量,并在onStart事件中重新启动线程... 但我仍然想知道是否有使用android系统本身的“默认”解决方案...


当用户不再查看活动时,您是否希望秒表继续计时?例如,如果用户接到电话,秒表应该停止还是继续计时? - DeeV
当活动不可见时,秒表应该停止...如果它一直运行,那只是浪费资源... - prom85
不过如果你想要在它用完时发出通知或通过通知显示倒计时,那就不行了。 - DeeV
我也想要这样做,因此我正在使用Android的AlarmManager...这样计时器(只是一个视觉反馈)就可以在活动不可见时停止...线程不够安全,因为它可能被杀死...服务是一种替代方案,但我读到AlarmManager在考虑资源方面更好。 - prom85
2个回答

2
好的。我现在更清楚你在做什么了。我以为你是在使用线程进行计数。现在听起来你是在使用线程更新用户界面。
相反,你应该使用一个自调用的HandlerHandler是一种非常方便的小类,可以异步运行。由于它们的多样性,在Android中它们被广泛使用。
static final int UPDATE_INTERVAL = 1000; // in milliseconds. Will update every 1 second

Handler clockHander = new Handler();

Runnable UpdateClock extends Runnable {
   View clock;

   public UpdateClock(View clock) {
      // Do what you need to update the clock
      clock.invalidate(); // tell the clock to redraw.
      clockHandler.postDelayed(this, UPDATE_INTERVAL); // call the handler again
   }
}

UpdateClock runnableInstance;

public void start() {
   // start the countdown
   clockHandler.post(this); // tell the handler to update
}

@Override
public void onCreate(Bundle icicle) {
   // create your UI including the clock view
   View myClockView = getClockView(); // custom method. Just need to get the view and pass it to the runnable.
   runnableInstance = new UpdateClock(myClockView);
}

@Override
public void onPause() {
   clockHandler.removeCallbacksAndMessages(null); // removes all messages from the handler. I.E. stops it
}

这将会把消息发布到Handler中并运行。在本例中,它每1秒发布一次。由于Handlers是消息队列,只有在可用时才会运行,所以会稍微有一点延迟。它们也会在创建它们的线程上运行,因此如果你在UI线程上创建它们,你就能够更新UI而无需任何花哨的技巧。在onPause()中移除消息以停止更新UI。时钟可以继续在后台运行,但你不再向用户显示它了。

0
我刚开始学习Android编程,但我认为在这种情况下不会调用onRestoreInstance,因为你并没有从一个活动切换到另一个活动。我认为你最好的选择是调用onPause,这将调用onSaveInstance(如果需要),但使用onResume,它可能会或可能不会调用onRestoreInstance

onPauseonResume是我使用onStoponStart的替代方法,但是在onResume事件中我也没有得到Bundle... onSaveInstance事件总是被调用,但是之后onRestoreInstance从未被调用... - prom85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接