почему я не могу запустить ProgressDialog внутри метода doInBackground AsyncTask? - PullRequest
0 голосов
/ 16 ноября 2011

Я не могу запустить ProgressDialog внутри doInBackground метода AsyncTask.Это дает мне следующую ошибку:

ОШИБКА / AndroidRuntime (12986): Причина: java.lang.RuntimeException: Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare ()

И ошибка в этой строке в коде:

final ProgressDialog dialog = ProgressDialog.show(GalleryView.this, "Refresh", "Loading... please wait", true);

Любая помощь очень ценится.

Ответы [ 4 ]

3 голосов
/ 16 ноября 2011

Вы можете показать progressdialog в методе onPreExecute и отклонить его в методе onPostExecute. Эти два метода выполняются в потоке пользовательского интерфейса. Метод doInBackGround запускается в другом потоке.

Другая возможность - просто показать диалоги выполнения, прежде чем запускать AsyncTask. Лично мне нравится возможность использовать onPreExecute и onPostExecute. Progressdialog затем красиво связывается с AsyncTask.

1 голос
/ 16 ноября 2011

ProgressDialog - это код пользовательского интерфейса, поэтому он должен происходить в очереди событий.AsyncTask запускается из очереди событий.Вы можете сделать диалог прогресса следующим образом:

ProgressBar progressBar = activity.findViewById(progressBarID);
progressBar.setIndeterminate(true)
progressBar.setVisibility(View.VISIBLE);
AsyncTask<Void, Void, Void> aTask = new AsyncTask<Void, Void, Void>(){
 @Override
  protected Void doInBackground(Void... arg0) {
    //Do your operations here
   return null;
 }

 @Override
 protected void onPostExecute(Void result) {
    progressBar.setVisibility(View.GONE);
        //Wrap up anything here, like closing the popup.
 }
};
aTask.execute((Void)null);
1 голос
/ 16 ноября 2011

Конструкция AsyncTask предназначена для разделения фоновых операций и операций потока пользовательского интерфейса. В пределах doInBrackground вы не находитесь в потоке пользовательского интерфейса, поэтому вы вообще не можете выполнять логику, связанную с пользовательским интерфейсом. Правильное место для этого - методы, которые выполняются в потоке пользовательского интерфейса. Я предполагаю, что для вашего конкретного случая такое место будет onPreExecute.

1 голос
/ 16 ноября 2011

Поскольку doinbackground не запускается в потоке пользовательского интерфейса, поэтому он не может создавать элементы пользовательского интерфейса. Вы должны создать диалоговое окно прогресса перед выполнением AsyncTask.

...