studio programacion herramientas fundamentos con avanzado aplicaciones android android-asynctask android-sdk-2.1 android-gridview

android - programacion - AsyncTask y setAdapter en métodos onCreate



manual de android en pdf (3)

AsyncTask tiene 3 métodos básicos:

protected void onPreExecute() { } protected void onPostExecute(Void unused) { // displaying images // set adapter for listview with downloaded items } protected Void doInBackground(Void... params) { // downloading and time consuming task }

para que pueda escribir g.setAdapter(new ImageAdapter(this)); dentro del onPostExecute(Void unused) porque en este momento, las imágenes ya se descargaron dentro del método doInBackground() .

Estoy haciendo algunas tareas de red pesadas: descargando imágenes (vistas previas). Para que mi IU principal no se bloquee, lo hice en una AsyncTask, quiero ponerlas en una GridView pero configuro el adaptador antes de que termine la AsyncTask. Algún código será más útil

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gridview); new LoadAllPictures().execute(); GridView g = (GridView) findViewById(R.id.gridview); g.setAdapter(new ImageAdapter(this)); }

Entonces, al final, Logcat muestra que todo se ha descargado, pero no hay nada en la pantalla. Intenté hacer la parte setAdapter en mi AsyncTask, pero me dice que: Only the original thread that created a view hierarchy can touch its views.

Que debería hacer ?


AsyncTask tiene un método útil que puede implementar llamado onPostExecute() . Se llama desde el hilo de interfaz de usuario original después de que la tarea se haya completado. Puede usarlo para configurar el adaptador desde el hilo correcto.


Para descargar imágenes de manera sincronizada y configurarlas en Vistas, puede utilizar la biblioteca Picasso, muy útil y sencilla:

Picasso.with(context) .load(url) .placeholder(R.drawable.user_placeholder) .error(R.drawable.user_placeholder_error) .into(imageView);

Si usa Android Studio y gradle, simplemente agréguelo al archivo gradle de la aplicación:

compile ''com.squareup.picasso:picasso:2.5.2''

La versión más fresca disponible en Github .