Android

Can't create handler inside thread that has not called Looper.prepare() inside AsyncTask for ProgressDialog

Не удается создать обработчик внутри потока, который не вызывал 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() в зависимости от условия, я:

[...]    
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
[...]

Всякий раз, когда я пытаюсь, downloadSpinnerProgressDialog.show() я получаю ошибку.

Есть идеи, ребята?

Переведено автоматически
Ответ 1

Метод show() должен вызываться из потока пользовательского интерфейса (UI), в то время как doInBackground() выполняется в другом потоке, что является основной причиной, по которой AsyncTask был разработан.

Вы должны вызвать show() либо in onProgressUpdate(), либо in 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();
2023-05-20 18:40 java android