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

时间:2011-06-30 08:20:33

标签: android android-asynctask android-service timertask

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

5 个答案:

答案 0 :(得分:119)

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 :(得分: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 :(得分: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/是一种不同的方法:服务器会在准备就绪时通知手机(因此,节省一些带宽和性能:))

答案 3 :(得分:2)

创建服务并通过Alarm Manager安排服务会不会更有效率?

答案 4 :(得分:0)

被接受的答案是有问题的。 使用TimerTask()通过处理程序激活异步任务是一个坏主意。在更改方向时,您必须记住还要取消计时器和处理程序调用。如果不是,它将在每次旋转时一次又一次调用异步任务。 这将导致应用程序使服务器崩溃(如果这是其余的http get请求)而不是X时间-最终,这些调用将每秒实例化多次调用。 (因为根据屏幕旋转数会有很多计时器)。如果在后台线程中运行的活动和任务很繁重,则可能会使应用程序崩溃。 如果您使用计时器,则将其设为类成员并取消onStop():

moment.utc("2018-10-03 05:55:51").local().format()

请尝试避免执行异步任务,如果必须,则请使用调度程序服务运行异步任务。或诸如此类的应用程序类: https://fattybeagle.com/2011/02/15/android-asynctasks-during-a-screen-rotation-part-ii/

或者使用简单的处理程序(不使用计时器,只使用postDelayed),并且很好的做法是调用取消异步任务onStop()。这段代码使用postDelayed可以正常工作:

            TimerTask mDoAsynchronousTask;


            @Override
            public void onStop(){
               super.onStop();                 
               mDoAsynchronousTask.cancel();
               mHandler.removeCallbacks(null);
               ... 
            }


          public void callAsynchronousTask(final boolean stopTimer) {
             Timer timer = new Timer();
             mDoAsynchronousTask = new TimerTask() {
                 @Override
                 public void run() {
                     mHandler.post(new Runnable() {
                 ...