2

我想在活动打开时重复任务。

例如,在活动打开时每分钟重复一次 foo()。

我对 Timer、handler 和 runable 很感兴趣。

我对这段代码很感兴趣:

也许有更好的方法?

public void setRefreshRate()
        {
          newTimer = true
            while(true)
            {
                if(newTimer)
                    new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {

                        if(isNetworkAvailable() && movedToAnotherActivity== false)
                            new GetWorkouts().execute();

                        newTimer = true;
                    }
            }, Integer.getInteger(data.getWallRefresh()));

                    newTimer = false;

            }
        }
4

2 回答 2

0

可能有更好的方法,但我喜欢AsyncTask,所以我可能会使用它并调用sleep()doInBackground()然后您可以调用cancel()您的任务对象并将其设置为完成nullActivity

 public void doInBackground(Void...params)
{
    boolean flag = false;
    while (!flag)
    {
       // do some work
       Thread.sleep(6000);
    }
}

然后在and中覆盖并设置flag为 true 。然后,如有必要,您可以使用任何其他方法来更新。onBackPressed()finish()AsyncTaskUI

异步任务

于 2013-08-14T23:16:14.493 回答
0

感谢codeMagic 的回答让我走上了正确的道路,但 AsyncTask 并不是真的为此而设计的。从文档

理想情况下,AsyncTasks 应该用于短操作(最多几秒钟。)

问题是,至少默认情况下,AsyncTasks 在同一个工作线程上按顺序运行,因此如果您尝试启动另一个 AsyncTask,它将无法运行,因为计时器循环永远不会结束。

为了解决这个问题,我只使用了一个原始线程,它工作正常。

apiUpdateTimerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                while(true) {
                    try {
                        Log.i(TAG, "UPDATE FROM THE API!!!!");
                        doSomeStuff();

                        Thread.sleep(5 * 1000);
                    } catch(InterruptedException e) {
                        Log.e(TAG, "API Update AsyncTask Interrupted", e);
                    }
                }
            }
        });

要停止它,只需调用

apiUpdateTimerThread.interrupt();
于 2017-02-02T11:00:01.377 回答