Как запустить задачу 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" });
}
}
Это мой код, и он отлично работает, но большая проблема, которую я истощаю в своей батарее?
Ответы
Ответ 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);
}
}