我想定期检查每30秒进行一次网络呼叫的更新并相应地更新列表视图,只有当我的屏幕在前台时(因此不是来自服务)。我正在做的是 -
private void refreshPeriodically()
{
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
new callToMyAsyncTask().execute(context);
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 30*1000); //execute in every 30 sec
}
但是,滚动时会挂起我的列表。
我该怎么做?
答案 0 :(得分:0)
你不应该使用处理程序。当您致电handler.post()
时,它将在UI
主题上运行,因此您的列表将会冻结。在callToMyAsyncTask
中的run方法中启动新的TimerTask
,而不使用处理程序,当您的活动不在前台时,您可以调用timer.cancel()
。
此外,我认为您应该使用scheduleAtFixedRate
代替schedule
。
但是我认为如果没有服务,你可能会遇到一些问题。当您取消定时器时,它不会取消当前callToMyAsyncTask
,并且当它呼叫onPostExecute
活动不再可用时。但我不知道它会不会崩溃。