Je ne comprends pas pourquoi je reçois cette erreur. J'utilise AsyncTask pour exécuter certains processus en arrière-plan.
J'ai:
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...");
}
Quand j'entre dans doInBackground()
selon une condition, je:
[...]
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
[...]
Chaque fois que j'essaie downloadSpinnerProgressDialog.show()
je reçois l'erreur.
Des idées les gars?
La méthode show()
doit être appelée à partir du thread interface utilisateur , tandis que doInBackground()
s'exécute sur un autre thread, ce qui est la raison principale pour laquelle AsyncTask
a été conçu.
Vous devez appeler show()
soit dans onProgressUpdate()
, soit dans onPostExecute()
.
Par exemple:
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();
}
}
J'ai eu un problème similaire, mais en lisant cette question, j'ai pensé que je pourrais exécuter le fil de l'interface utilisateur:
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
alertDialog.show();
}
});
Semble faire le tour pour moi.
J'ai eu du mal à faire ce travail aussi, la solution pour moi était d'utiliser à la fois les réponses hyui et 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();
}
});
}
}
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();