Сложность изменения сообщения о прогрессе в асинхронной задаче - PullRequest
5 голосов
/ 30 января 2012

Я создал асинхронную задачу и хочу изменить сообщение диалога прогресса на разных этапах doBackground. Вот код:

public class sc extends AsyncTask<Integer,String,Void>
    {
        ProgressDialog dialog;
        protected void onPreExecute()
        {
            dialog=new ProgressDialog(Loc.this);
            dialog.show();
        }
        @Override
        protected Void doInBackground(Integer... params) 
        {

            onProgressUpdate("Contacting server..Please wait..");
            //Do some work
            onProgressUpdate("Processing the result");
            //Do some work
            onProgressUpdate("Calculating..");
            dialog.dismiss();
            return null;
        }
        protected void onProgressUpdate(String ui)
        {
            dialog.setMessage(ui);
        }


}

Но проблема в том, что в диалоговом окне прогресса всегда отображается только первое сообщение. Пожалуйста, помогите мне найти решение.

Ответы [ 3 ]

8 голосов
/ 30 января 2012
protected Void doInBackground(Integer... params) 
{
    onProgessUpdate("Contacting server..Please wait..");
    ...
}

Уррм, нет, это не сработает.

Try ...

publishProgress("Contacting server..Please wait..");

Вы должны " опубликовать " ваш прогресс в doInBackground(..), чтобы вызвать onProgressUpdate(...).

Также не звоните dialog.dismiss() в doInBackground(...), вместо этого звоните в onPostExecute(...).

3 голосов
/ 30 января 2012

Я думаю, что должно быть ..

publishProgress("Your Dialog message..");

не

onProgessUpdate("Processing the result"); 

в doInBack .. ()

Что-то вроде,

protected Long doInBackground(URL... urls) {
      publishProgress("Hello");
     return null;
 }

 protected void onProgressUpdate(String msg) {
     dialog.setMessage(msg);

 }
0 голосов
/ 13 марта 2018

Возможно, проблема в том, что вы не установили «начальное сообщение». Если вы не установили сообщение для вашего ProgressDialog, прежде чем пытаться сделать это внутри onProgressUpdate, оно не будет работать.

ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Title");
progressDialog.setMessage("Initial message needed");

public class foo extends AsyncTask<Void,Integer,Void> {
    ...
}

Также обратите внимание, что если вам нужно как обновление прогресса, так и сообщение, вы можете использовать аргумент переменной Integer, где одно из целых чисел определяет величину прогресса, а другое - сообщение как индекс массива String[]. сообщений (если сообщения известны заранее).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...