如何在android中的每个x分钟运行异步任务?

时间:2011-06-01 20:39:25

标签: android android-asynctask

如何在特定时间运行异步任务? (我想每隔2分钟运行一次)

我尝试使用延迟发布但不起作用?

    tvData.postDelayed(new Runnable(){

    @Override
    public void run() {
        readWebpage();

    }}, 100);

在上面的代码中,readwebpage是为我调用异步任务的函数..

现在,下面是我正在使用的方法

   public void onCreate(Bundle savedInstanceState) {

         readwebapage();

   }

   public void readWebpage() {
    DownloadWebPageTask task = new DownloadWebPageTask();
    task.execute("http://www.google.com");

   }

   private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
        String response1 = "";
        response1=read(); 
                   //read is my another function which does the real work    
        response1=read(); 
        super.onPostExecute(response1);
        return response1;
    }


      protected void onPostExecute(String result) {


         try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            TextView tvData = (TextView) findViewById(R.id.TextView01);
            tvData.setText(result);

        DownloadWebPageTask task = new DownloadWebPageTask();
        task.execute(new String[] { "http://www.google.com" });

    }

    }

这就是我的代码,它的工作原理非常好,但是我的电池耗尽了大问题?

9 个答案:

答案 0 :(得分:67)

如果您想每隔X秒启动一次,就可以使用处理程序。处理程序很好,因为您在触发事件时不需要额外的线程来跟踪。这是一个简短的片段:

private final static int INTERVAL = 1000 * 60 * 2; //2 minutes
Handler mHandler = new Handler();

Runnable mHandlerTask = new Runnable()
{
     @Override 
     public void run() {
          doSomething();
          mHandler.postDelayed(mHandlerTask, INTERVAL);
     }
};

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

void stopRepeatingTask()
{
    mHandler.removeCallbacks(mHandlerTask);
}

请注意doSomething不应该花费很长时间(比如UI中音频播放的更新位置)。如果可能需要一些时间(例如下载或上传到网络),那么您应该使用ScheduledExecutorServicescheduleWithFixedDelay功能。

答案 1 :(得分:29)

使用HandlerPostDelayed

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
        readWebpage();
        handler.postDelayed(this, 120000); //now is every 2 minutes
    }
 }, 120000); //Every 120000 ms (2 minutes)

答案 2 :(得分:7)

您可以使用TimerTask而不是AsyncTask。

例如:

Timer myTimer = new Timer("MyTimer", true);
myTimer.scheduleAtFixedRate(new MyTask(), ASAP, TWO_MINUTES);


private class MyTask extends TimerTask {

    public void run(){
      readWebPage();
    }

}

答案 3 :(得分:1)

当手机进入睡眠模式时,为了节省电量,并且很可能在2分钟的间隔内发生,Handler.postDelayed()可能会错过预定的时间。对于此类活动,您应该使用AlarmManager,锁定PowerManager以防止在运行AsyncTask时进入睡眠状态。

请参阅我的帖子,其中包含代码示例here

您也可以阅读Scheduling Repeating Alarms

答案 4 :(得分:1)

我建议使用Handler#postDelayed(Runnable)。请注意,此方法仅适用于您的应用正在运行(可能在后台),但如果用户手动关闭它,或者只是Android内存不足,它将停止工作,不会稍后重新启动 - 因为你需要使用服务。

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        handler.postDelayed(this, 2 * 60 * 1000); // every 2 minutes
        /* your code here */
    }
}, 2 * 60 * 1000); // first run after 2 minutes

此代码将等待2分钟,执行您的代码,然后每2分钟继续执行此操作。但如果你想让它第一次立即 - 然后然后启动wait-do循环,而是使用:

final Handler handler = new Handler();
 /* your code here */
new Runnable() {
    @Override
    public void run() {
        handler.postDelayed(this, 2 * 60 * 1000); // every 2 minutes
         /* and also here - your code */
    }
}.run(); 

或者,如果您的代码长于一个方法(在这种情况下为readWebsite()),并且您不希望重复该代码:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        handler.postDelayed(this, 2 * 60 * 1000); // every 2 minutes
         /* your longer code here */
    }
}, 0); // first run instantly

(^这个就像第一个例子,但在第一次运行之前有0ms延迟,而不是2分钟)

(这个答案基于@Devashish Mamgain的答案,但我为编辑添加了太多细节,所以我不得不添加一个新的)

答案 5 :(得分:0)

尝试扩展Thread课程,将睡眠时间设置为2000毫秒,然后将调用放入run方法。应该这样做。

答案 6 :(得分:0)

您可以使用Time with Handler和TimerTask

  final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask backtask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        try {
                            //To task in this. Can do network operation Also
                            Log.d("check","Check Run" );
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                        }
                    }
                });
            }
        };
        timer.schedule(backtask , 0, 20000); //execute in every 20000 ms*/

您可以使用&#39;检查&#39;检查logcat以验证是否正在运行标签名称

答案 7 :(得分:0)

执行多个消息(Runnables)然后他应该使用负责在线程中创建队列的Looper类。例如,在编写从Internet下载文件的应用程序时,我们可以使用Looper类将要下载的文件放入队列中。这将帮助您在Android中执行异步任务...

HandlerThread hThread = new HandlerThread("HandlerThread");
  hThread.start();
  Handler handler = new Handler(hThread.getLooper());
  final Handler handler1 = new Handler(hThread.getLooper());
  final long oneMinuteMs = 60 * 1000;

  Runnable eachMinute = new Runnable() { 
   @Override
   public void run() {
    Log.d(TAG, "Each minute task executing");
    handler1.postDelayed(this, oneMinuteMs);
    sendPostRequest();
   }
  };
 // sendPostRequest();
  // Schedule the first execution
  handler1.postDelayed(eachMinute, oneMinuteMs);

答案 8 :(得分:-13)

您可以在AsyncTask内运行一个循环,在执行任务之间休眠两秒钟。像这样:

protected Result doInBackground (Params... params) {
    while (!interrupted) {
        doWork();
        Thread.sleep(2000);
    }
}