活动打开时重复任务

时间:2013-08-14 23:06:27

标签: android

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

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

我讨论过Timer,处理程序和可运行的。

我讨论了这段代码:

也许有更好的方法?

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;

            }
        }

2 个答案:

答案 0 :(得分:0)

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

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

然后覆盖并在flagonBackPressed()中将finish()设置为true。然后,您可以使用任何其他AsyncTask方法在必要时更新UI

AsyncTask

答案 1 :(得分:0)

感谢codeMagic's answer让我走上了正确的道路,但AsyncTask并不是真的为此而设计的。来自docs

  

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

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

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

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();
相关问题