6

我该如何正确地做到这一点?

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

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

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

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

4

2 回答 2

2

好的。我现在更好地理解你在做什么。我以为你在用线程来计数。现在听起来你正在使用它来更新 UI。

相反,您可能应该做的是使用 self-calling HandlerHandlers 是可以异步运行的漂亮的小类。由于它们的多样性,它们在 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。时钟可以继续在后台运行,但您不会再向用户显示它。

于 2013-01-17T15:55:26.637 回答
0

我刚刚进入 Android 编程,但我认为onRestoreInstance不会在那种情况下被调用,因为你没有从一个活动切换到另一个活动。我认为你最好的选择是 call onPausewhich 会onSaveInstance在你需要的时候跟注,但是使用onResumewhich may or might not call onRestoreInstance

于 2013-01-17T14:37:07.540 回答