timer.scheduleAtFixedRate在我调用cancel时不会停止。

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中看到定时器仍在运行,并且除非应用被销毁,否则不会停止。因此,在activity的 onPause 中,我调用了 myTimer.cancel(); 但是没有起作用。即使应用程序未在屏幕上,我仍然可以在logcat中看到更新。那么,如何停止 timerTask

3个回答

8

以下是您的代码放入我的文件中,延迟和周期值进行了调整,以便我不必等待太久。我运行应用程序。我在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();
    }
}

奇怪。你的onPause方法中Log.v有显示任何内容吗?如果没有,我认为它可能被拼错了,或者你的P不是大写字母,或者其他一些不正确的地方--因此它实际上并没有被调用。 - Anthony Tietjen

0
实际答案是:需要正确定义onPause方法。 整个故事:
提问者错误地定义了onPause方法。这就是提出这个问题的原因。
我写这篇文章是因为我花了太多时间阅读问题、答案、代码和评论。真正的答案藏在最后一个评论中。

0

可能是因为线程已经被发送出去,它会最后运行一次。在 onLoad 中设置一个变量为 true,然后在 onPause 中设置为 false。然后在你的计时器任务中,只有当变量为 true 时才运行你的代码。

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


你的代码对我来说是有效的,除了我去掉了wv.reload(); -- 不确定你在那个方法中做了什么。它是否会导致应用程序重新启动? - Anthony Tietjen
另外,您可以在onPause方法中添加Log.v以确保它实际上被触发了吗? - Anthony Tietjen
wv.reload,我刚刚重新加载了一个Web视图。奇怪的是它对你起作用。 - Daler

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