java - tutorial - No se puede crear el controlador dentro de la hebra que no ha llamado a Looper.prepare() dentro de AsyncTask para ProgressDialog
runonuithread vs asynctask (4)
No entiendo por qué estoy recibiendo este error. Estoy usando AsyncTask para ejecutar algunos procesos en segundo plano.
Yo tengo:
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...");
}
Cuando doInBackground()
en doInBackground()
dependiendo de una condición I:
[...]
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
[...]
Cada vez que pruebo downloadSpinnerProgressDialog.show()
recibo el error.
Alguna idea chicos?
El método show()
debe doInBackground()
desde el subproceso Interfaz de usuario (UI) , mientras que doInBackground()
ejecuta en un subproceso diferente, que es la razón principal por la que se diseñó AsyncTask
.
onProgressUpdate()
llamar a show()
en onProgressUpdate()
o en onPostExecute()
.
Por ejemplo:
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();
}
}
También tuve dificultades para hacer este trabajo, la solución para mí fue usar respuestas tanto de hyui como de 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();
}
});
}
}
Tuve un problema similar, pero al leer esta pregunta, pensé que podía ejecutar el hilo de UI:
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
alertDialog.show();
}
});
Parece hacer el truco para mí.
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();