Je continue à obtenir une erreur dans mon doInBackground()Erreur dans doBackground AsyncTask?
07-20 21:05:20.859: ERROR/AndroidRuntime(3289): java.lang.RuntimeException: An error occured while executing doInBackground()
07-20 21:05:20.859: ERROR/AndroidRuntime(3289): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Voici ma méthode de AsyncTask.
private class MyTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {try {
getImages();
Log.v("MyTask", "Image 1 retreived");
getImage2();
Log.v("MyTask", "Image 2 retreived");
getImage3();
Log.v("MyTask", "Image 3 retreived");
getImage4();
Log.v("MyTask", "Image 4 retreived");
} catch (IOException e) {
Log.e("MainMenu retreive image", "Image Retreival failed");
e.printStackTrace();
}
return null;
}
protected Void onPostExecute(){
((Gallery) findViewById(R.id.gallery))
.setAdapter(new ImageAdapter(MainMenu.this));
return null;
}
}
}
Et il tient toujours mon interface utilisateur pour une raison quelconque. l'interface utilisateur n'apparaît qu'après son fait.
Voici mon onCreate() où j'exécute la tâche asynchrone.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MyTask myTask = new MyTask();
myTask.execute();
}
Vous devez lire les différentes méthodes d'un 'AsyncTask'. De la façon dont vous l'avez écrit, vous récupérez vos images sur le thread de l'interface utilisateur et essayez de définir votre adaptateur dans un thread séparé (ce qui explique pourquoi vous obtenez l'erreur). –
Votre 'onPostExecute()' ne sera pas appelé, car il ne fait pas partie de l'interface de 'AsyncTask', car il ne surcharge pas la bonne méthode. Les génériques que vous avez spécifiés suggèrent que votre méthode onPostExecute prendra un objet Void en tant que paramètre pour remplir le contrat 'AsyncTask'. La déclaration de méthode devrait ressembler à ceci: 'onPostExecute (Void notUsed)'. C'est la raison pour laquelle l'annotation '@ Override' est extrêmement utile. –
donc @Override protected void onPostExecute (Void notUsed) {return; { – yoshi24