我想在活动开放时重复任务。
例如,在活动打开时每分钟重复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;
}
}
答案 0 :(得分:0)
可能有一种更好的方法,但我喜欢AsyncTask
,所以我可能会使用它并在sleep()
中调用doInBackground()
,然后您可以在任务对象上调用cancel()
在null
完成时将其设置为Activity
。
public void doInBackground(Void...params)
{
boolean flag = false;
while (!flag)
{
// do some work
Thread.sleep(6000);
}
}
然后覆盖并在flag
和onBackPressed()
中将finish()
设置为true。然后,您可以使用任何其他AsyncTask
方法在必要时更新UI
。
答案 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();