0

我想定期检查每 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
}

但是,这会在滚动时挂起我的列表。

我该怎么做?

4

1 回答 1

0

你不应该使用处理程序。当您调用handler.post()它时,它将在UI线程上运行,因此您的列表将冻结。在不使用处理程序的情况下启动一个新callToMyAsyncTask的运行方法,您可以在您的活动不在前台时调用。TimerTasktimer.cancel()

另外我认为你应该使用scheduleAtFixedRate而不是schedule.

但是,我认为如果没有服务,您可能会遇到一些问题。当您取消计时器时,它不会取消当前callToMyAsyncTask并且当它调用onPostExecute活动不再可用时。但我不知道它会不会崩溃。

于 2014-09-21T09:54:45.360 回答