Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare() внутри AsyncTask для ProgressDialog
Я не понимаю, почему я получаю эту ошибку. Я использую AsyncTask для запуска некоторых процессов в фоновом режиме.
У меня есть:
protected void onPreExecute()
{
connectionProgressDialog = new ProgressDialog(SetPreference.this);
connectionProgressDialog.setCancelable(true);
connectionProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
connectionProgressDialog.setMessage("Connecting to site...");
connectionProgressDialog.show();
downloadSpinnerProgressDialog = new ProgressDialog(SetPreference.this);
downloadSpinnerProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
downloadSpinnerProgressDialog.setMessage("Downloading wallpaper...");
}
Когда я попадаю в doInBackground()
в зависимости от условия I:
[...]
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
[...]
Всякий раз, когда я пытаюсь downloadSpinnerProgressDialog.show()
, я получаю ошибку.
Любые идеи ребята?
Ответы
Ответ 1
Метод show()
должен быть вызван из потока пользовательского интерфейса (UI), а doInBackground()
работает в разных потоках, что является основной причиной, по которой AsyncTask
.
Вы должны позвонить show()
либо в onProgressUpdate()
, либо в onPostExecute()
.
Например:
class ExampleTask extends AsyncTask<String, String, String> {
// Your onPreExecute method.
@Override
protected String doInBackground(String... params) {
// Your code.
if (condition_is_true) {
this.publishProgress("Show the dialog");
}
return "Result";
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
}
}
Ответ 2
У меня была аналогичная проблема, но, прочитав этот вопрос, я решил, что могу запустить поток пользовательского интерфейса:
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
alertDialog.show();
}
});
Кажется, это трюк для меня.
Ответ 3
Мне тоже пришлось делать эту работу слишком сложно, решение для меня состояло в том, чтобы использовать как hyui, так и konstantin ответы,
class ExampleTask extends AsyncTask<String, String, String> {
// Your onPreExecute method.
@Override
protected String doInBackground(String... params) {
// Your code.
if (condition_is_true) {
this.publishProgress("Show the dialog");
}
return "Result";
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
alertDialog.show();
}
});
}
}
Ответ 4
final Handler handler = new Handler() {
@Override
public void handleMessage(final Message msgs) {
//write your code hear which give error
}
}
new Thread(new Runnable() {
@Override
public void run() {
handler.sendEmptyMessage(1);
//this will call handleMessage function and hendal all error
}
}).start();