How to run an async task for every x mins in android?

前端 未结 9 1047
长发绾君心
长发绾君心 2020-11-27 12:28

how to run the async task at specific time? (I want to run it every 2 mins)

I tried using post delayed but it\'s not working?

    tvData.postDelayed         


        
相关标签:
9条回答
  • 2020-11-27 12:59

    I suggest to go with Handler#postDelayed(Runnable). Keep in mind that this method will work only when your app is running (may be in background) but if user closes it manually or simply Android runs out of memory it'll stop working and won't be restarted again later - for that you need to use services.

    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
    

    This code will wait 2 minutes, execute your code, and then keep doing that every 2 minutes. But if you want it to run instantly for the first time - and then start the wait-do loop, instead use:

    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(); 
    

    or, if your code is longer than just one method (readWebsite() in this case), and you don't want that to be duplicated:

    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
    

    (^ this one is just like the first example but has a 0ms delay before first run instead of 2 minutes)

    (This answer is based on @Devashish Mamgain's one but I added too much details for an edit so I had to add a new one)

    0 讨论(0)
  • 2020-11-27 13:02

    Use Handler and PostDelayed:

    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)
    
    0 讨论(0)
  • 2020-11-27 13:02

    When phone goes to sleep mode, to save battery, and it is quite possible to happen within 2 mins interval, Handler.postDelayed() may miss scheduled time. For such activities you should use AlarmManager, get a lock with PowerManager to prevent going to sleep back while you're running the AsyncTask.

    See my post with code sample here

    Also you may want to read Scheduling Repeating Alarms

    0 讨论(0)
  • 2020-11-27 13:02

    You could run a loop within the AsyncTask that sleeps for two seconds between doing the tasks. Something like this:

    protected Result doInBackground (Params... params) {
        while (!interrupted) {
            doWork();
            Thread.sleep(2000);
        }
    }
    
    0 讨论(0)
  • 2020-11-27 13:11

    Try extending the Thread class, set a sleep time of 2000 millis and place your call into the run method. That should do it.

    0 讨论(0)
  • 2020-11-27 13:18

    Execute multiple messages(Runnables) then he should use the Looper class which is responsible for creating a queue in the thread. For example, while writing an application that downloads files from the internet, we can use Looper class to put files to be downloaded in the queue. This will help you to perform async task in 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);
    
    0 讨论(0)
提交回复
热议问题