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

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

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

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

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

Вы можете использовать обработчик, если вы хотите инициировать что-то каждые 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 .

Использовать 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) 

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

например:

 Timer myTimer = new Timer("MyTimer", true); myTimer.scheduleAtFixedRate(new MyTask(), ASAP, TWO_MINUTES); private class MyTask extends TimerTask { public void run(){ readWebPage(); } } 

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

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

Также вы можете прочитать « Планирование повторяющихся сигналов»

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

Вы можете использовать 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'

Я предлагаю пойти с 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, но я добавил слишком много деталей для редактирования, поэтому мне пришлось добавить новый)

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

 protected Result doInBackground (Params... params) { while (!interrupted) { doWork(); Thread.sleep(2000); } } 
Intereting Posts
Запустить нить из другого потока Java.lang.UnsupportedOperationException: невозможно преобразовать в измерение: type = 0x12 Как сделать приложение не загружаемым пользователями Android KitKat? Dex: Как установить dex.force.jumbo = true в Maven pom через android-maven-plugin? Аутентификация Siteminder и Android Возобновить работу на Android Округленные углы cardView не работают в RecyclerView – Android? Бесплатная библиотека диаграмм для создания линий, бара (сложена и сгруппирована) и объединена в Android Тесты на ногу для студий (инструментов) для Android Вкладки панели действий не заполняют ширину экрана Android конвертировать ширину текста (в пикселях) в проценты от ширины / высоты экрана Как создавать вкладки в приложении Android и динамически добавлять вкладки (в зависимости от соответствия пользователей) Плагины PhoneGap для Android не загружаются Phonegap всегда просит меня установить android sdk 19, но я уже установил его ArrayAdapter Android без контекста