Подтвердить что ты не робот

Как запустить задачу async для каждого x mins в android?

как запустить задачу async в определенное время? (Я хочу запускать его каждые 2 минуты)

Я пробовал использовать post delayed, но он не работает?

    tvData.postDelayed(new Runnable(){

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

    }}, 100);

В приведенном выше коде readwebpage является функцией, которая вызывает для меня задачу async..

Прямо сейчас, это метод, который я использую

   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" });

    }

    }

Это мой код, и он отлично работает, но большая проблема, которую я истощаю в своей батарее?

4b9b3361

Ответ 1

Вы можете использовать обработчик, если вы хотите инициировать что-то каждые 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 не должно занимать много времени (что-то вроде положения обновления воспроизведения аудио в пользовательском интерфейсе). Если это может занять некоторое время (например, загрузка или загрузка в Интернет), тогда вы должны использовать ScheduledExecutorService scheduleWithFixedDelay.

Ответ 2

Используйте Handler и 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)

Ответ 3

вы можете использовать TimerTask вместо AsyncTask.

Пример:

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


private class MyTask extends TimerTask {

    public void run(){
      readWebPage();
    }

}

Ответ 4

Когда телефон переходит в спящий режим, чтобы сэкономить аккумулятор, и это вполне возможно в течение 2 минут, Handler.postDelayed() может пропустить запланированное время. Для таких действий вы должны использовать AlarmManager, получить блокировку с помощью PowerManager, чтобы предотвратить спящий режим во время работы AsyncTask.

Смотрите мой пост с образцом кода здесь

Также вы можете прочитать Планирование повторных тревог

Ответ 5

Попробуйте расширить класс Thread, установите время сна в 2000 миллисекунд и поместите свой вызов в метод run. Это должно сделать это.

Ответ 6

Вы можете использовать Time with Handler и TimeTask

  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*/

Вы можете проверить logcat, чтобы проверить, работает ли он или нет, с помощью тега 'check'

Ответ 7

Я предлагаю пойти с 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

(^ это точно так же, как в первом примере, но с задержкой 0 мс перед первым запуском вместо 2 минут)

(Этот ответ основан на @Devashish Mamgain, но я добавил слишком много деталей для редактирования, поэтому мне пришлось добавить новый)

Ответ 8

Вы можете запустить цикл внутри AsyncTask, который засыпает в течение двух секунд между выполнением задач. Что-то вроде этого:

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