Обновить пользовательский интерфейс во время работы в фоновом режиме

У меня есть операция обновления базы данных, у которой есть активность, которая постоянно обновляет процент, и она выполняется внутри 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 ), поэтому независимо от того, нажмет ли пользователь кнопку «Домой», она будет продолжать работать, но она должна обновлять процент в пользовательском интерфейсе., и когда пользователь покидает экран и возвращается к нему, он показывает текущее процентное значение, обновленное на экране.

Какое решение лучше всего подходит для моего случая?

Спасибо.

6
задан rogcg 27 April 2012 в 17:16
поделиться