У меня есть операция обновления базы данных, у которой есть активность, которая постоянно обновляет процент, и она выполняется внутри AsyncTask.
Внутри doInBackground ()Я вызываю контроллер, который обновляет базу данных и продолжает обновлять процент активности, однако, если я нажимаю кнопку «Домой» или «Назад», операция отменяется. Что ты предлагаешь мне сделать?
Я пытался запустить службу внутри doInBackground (), чтобы она работала в фоновом режиме, но похоже, что она не работает.
Мой код выглядит следующим образом:
public class UpdateDatabaseAsyncTask extends AsyncTask<Void, Integer, Integer>
{
@Override
public void onPreExecute()
{
mCustomProgressBar.startAnimation();
}
@Override
public Integer doInBackground(Void... params)
{
return mController.updateDatabase();
}
@Override
public void onPostExecute(Integer result)
{
mCustomProgressBar.stopAnimation();
// finish the activity
}
@Override
public void onProgressUpdate(Integer... value)
{
updatePercentageValue(value[0]);
}
public void callPublishProgress(Integer value)
{
publishProgress(value);
}
}
И внутри контроллера я вызываю метод callPublishProgress(value)
, передавая текущее процентное значение, так что оно будет publishProgress(value)
в пользовательском интерфейсе.
Во время отладки я нажал кнопку «домой/назад», и рабочий поток просто остановился.
Еще одно решение, которое я пробовал, заключалось в запуске службы в фоновом режиме независимо от того, нажимал ли пользователь кнопку домой/назад или нет, поэтому я подумал:и Служба вызовет метод контроллера, который выполняет работу, и в любом случае вызовет callPublishProgress(value)
для обновления процентного значения в пользовательском интерфейсе.
Однако происходит следующее: код достигает doInBackground()
и запускает службу, но сразу переходит к onPostExecute()
, просто не дожидаясь завершения службы (, конечно!). Так что это дает NullPointerException
. Я думал сделать цикл внутри doInBackground()
с установленным флагом в сервисе, чтобы он выходил из этого цикла, пока сервис не был завершен (Я использовал IntentService ), но это не сработало в любом случае.
Я тоже думал об использовании таймера. Но я не знаю.
Я читал статьи в документации о потоках и т. д. И там предлагается использовать AsyncTask
, как я и пытался сделать. Это также говорит о runOnUiThread(Runnable)
.
В любом случае, мне нужно выполнить операцию в фоновом режиме (, возможно, с помощью IntentService ), поэтому независимо от того, нажмет ли пользователь кнопку «Домой», она будет продолжать работать, но она должна обновлять процент в пользовательском интерфейсе., и когда пользователь покидает экран и возвращается к нему, он показывает текущее процентное значение, обновленное на экране.
Какое решение лучше всего подходит для моего случая?
Спасибо.