2011-06-30 107 views
51

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

回答

108
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 
} 
+1

非常感谢.... – Waseem

+3

一个异步任务无论如何运行在自己的线程。为什么在处理程序上运行它? – Siddharth

+9

是的,异步任务在单独的线程上运行,但不能从UI线程以外的其他线程启动。我想这个处理程序是允许的。 – r1k0

2

你可以处理程序:

private int m_interval = 5000; // 5 seconds by default, can be changed later 
private Handle m_handler; 

@Override 
protected void onCreate(Bundle bundle) 
{ 
    ... 
    m_handler = new Handler(); 
} 

Runnable m_statusChecker = new Runnable() 
{ 
    @Override 
    public void run() { 
      updateStatus(); //this function can change value of m_interval. 
      m_handler.postDelayed(m_statusChecker, m_interval); 
    } 
} 

void startRepeatingTask() 
{ 
    m_statusChecker.run(); 
} 

void stopRepeatingTask() 
{ 
    m_handler.removeCallback(m_statusChecker); 
} 

但我会建议你检查这个框架:http://code.google.com/intl/de-DE/android/c2dm/是一种不同的方法:当事情是准备服务器将通知电话(因此,节省了一些带宽和性能:))

+0

感谢alot.Actually我只是发展application.Server侧的客户端已经工作了为iPhone开发的同一个应用程序,我不得不使用的Android – Waseem

+1

在同一台服务器我是新来穿线在android中。你在哪里把runnable传递给处理程序? –

+2

回答@DheeB,回答者在这里没有提到它,尽管它应该在实例化过程中像这样m_handler = new Handler(m_statusChecker);此解决方案可能无法正常工作的另一个原因,因为问题清楚地表明将有网络操作“自动从服务器下载所有最新的未读问候语”..但是,尽管您正在使用处理程序,但此处理程序/ runnable仍在运行在仍然阻塞的UI线程中。您需要手动在单独的线程中启动它。 – tony9099

2

创建一个服务并通过报警管理器进行安排效率更高吗?

+1

创建服务是一种痛苦,所以很多事情都需要关注服务。我宁愿只使用一个计时器。 – Siddharth

+2

服务很容易启动和停止。另外,它们并不依赖于UI线程。所以是的,我会使用服务。 –

+0

@IgorGanapolsky是的,他们是。但他们也很麻烦,为什么他们为小操作创建asyntask,计时器和这些模块,如果它们是无意义的,一切都将通过服务完成? – tony9099

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); 
        } 
+2

建议您在Android文档https://developer.android.com/reference/java/util/Timer.html中使用Timer上的ScheduledThreadPoolExecutor来支持所有新代码 –

相关问题