9

在 onCreate,我运行一个每分钟重复的任务。我是怎么做的:

myTimer = new Timer();
    int delay = 30000;   // delay for 30 sec.
    int period = 600000;  // repeat every 60 sec.
    doThis = new TimerTask() {
      public void run() {

                     Log.v("TImer","repeated");
                     wv.reload();

      }
    };

    myTimer.scheduleAtFixedRate(doThis, delay, period);

所有这些代码都在 onCreate 中。因此,当应用程序从屏幕上消失时,我可以在 logcat 中看到计时器钢运行,并且不会停止,除非应用程序被销毁。所以,onPause我打电话给活动,myTimer.cancel();但没有帮助。即使应用程序不在屏幕上,我仍然可以在 logcat 中看到更新。那么,如何停止timerTask呢?

4

3 回答 3

7

这是您放入我文件中的代码,并调整了值延迟和周期,因此我不必等待这么长时间。我运行应用程序。我在 LogCat 中看到了这些消息。我按下 Galaxy S3 上的主页按钮。然后消息在 LogCat 中停止。

public class MainActivity extends Activity {
    Timer myTimer;
    TimerTask doThis;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myTimer = new Timer();
        int delay = 0;   // delay for 30 sec.
        int period = 1000;  // repeat every 60 sec.
        doThis = new TimerTask() {
          public void run() {

                         Log.v("TImer","repeated");

          }
        };

        myTimer.scheduleAtFixedRate(doThis, delay, period);
    }

    @Override
    protected void onPause() {
        myTimer.cancel();
        super.onPause();
    }
}
于 2013-01-10T07:48:17.760 回答
0

可能是因为线程已经发出,所以最后一次运行。在 onLoad 中将一个变量设置为 true,然后在 onPause 中将其设置为 false。然后在您的计时器任务中,仅当变量为真时才运行您的代码。

不过,写入新 if 语句之外的日志。如果它确实只是最后一次运行它,那么这可能是您的解决方案。但是,如果它在 onPause 之后仍然一遍又一遍地运行它,那么不要采用我的解决方案。

于 2013-01-10T07:23:55.140 回答
0

实际答案是onPause需要正确定义方法。

整个故事:
提问者定义onPause错误的方法。这就是问这个问题的原因。

我写这篇文章是因为我花了太多时间阅读问题、答案、代码和评论。真正的答案隐藏在最后一条评论中。

于 2019-08-01T12:53:10.103 回答