如何在固定的时间间隔后重复执行异步任务

Was*_*eem 59 android android-service timertask android-asynctask

如何在一段时间间隔之后重复执行异步任务,就像Timer一样...实际上我正在开发一个应用程序,它会自动从服务器下载所有最新的未读问候语,为此我必须在修复后检查服务器的更新时间间隔....我知道可以通过计时器轻松完成,但我想使用异步任务,我认为对Android应用程序更有效.

Ras*_*sel 122

public void callAsynchronousTask() {
    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 {
                        PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
                        // PerformBackgroundTask this class is the class that extends AsynchTask 
                        performBackgroundTask.execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,异步任务确实在单独的线程上运行,但不能从除UI线程之外的其他线程启动.我想,处理程序是允许的. (9认同)
  • 如果启动这些AsyncTasks的Activity被终止(通过方向更改或操作系统中断,如电话呼叫),此技术会留下悬空引用.因此,如果您对这些时间的编程崩溃感到满意,那么请务必使用此方法. (6认同)
  • 无论如何,Async Task都在自己的线程中运行.为什么要在处理程序上运行它? (3认同)
  • @colti:没有找到一个好的解决方案.除了非常简单的东西外,我已经放弃了ASyncTasks.对于更复杂的操作,我使用服务(是的,我知道,开销是一个痛苦的$$,但至少它没有崩溃那么多.只是要小心清理,不要留下悬空服务) . (2认同)

rit*_*326 6

  //Every 10000 ms   
       private void doSomethingRepeatedly() {
      Timer timer = new Timer();
      timer.scheduleAtFixedRate( new TimerTask() {
            public void run() {

                  try{

                     new SendToServer().execute(); 

                  }
                  catch (Exception e) {
                      // TODO: handle exception
                  }

             }
            }, 0, 10000);
                     }
Run Code Online (Sandbox Code Playgroud)

  • 建议在android文档https://developer.android.com/reference/java/util/Timer.html中为所有新代码支持ScheduledThreadPoolExecutor over Timer. (2认同)