Asynctask ArrayList objeto que no pasa de doInBackground a onPostExecute

Tengo un AsyncTask que toma en contexto (usado onPostExecute ) y ejecuta doInBackground para devolver un ArrayList de objetos de un servidor. Cuando ejecuto esto puedo ver que doInBackground corre muy bien, sin embargo, no está pasando el resultado a onPostExecute .

Después de mucha búsqueda, todavía tengo que encontrar una respuesta de cómo devolver un ArrayList de objetos en un AsyncTask .

Este es el objeto que estoy creando en doInBackground y usando onPostExecute :

 public class ServerTimeCard { public String eventNameInput; Boolean isLocation, isImage, isVoice; public ServerTimeCard(String eventNameInput, boolean isLocation, boolean isImage, boolean isVoice) { this.eventNameInput = eventNameInput; this.isLocation = isLocation; this.isImage = isImage; this.isVoice = isVoice; } } 

Estoy ejecutando el AsyncTask con new LoadFriendCards(context).execute(); En onCreate .

  • Salida esperada: doInBackground debe devolver un ArrayList a onPostExecute

  • Salida actual : El ArrayList<ServerTimeCard> en onPostExecute tiene un tamaño de cero cuando el mismo arraylist en doInBackground tiene un tamaño mayor.

El siguiente es el código AsyncTask .

 public class LoadFriendCards extends AsyncTask<Void, Void, ArrayList<ServerTimeCard>> { Context context; ArrayList<ServerTimeCard> result; public LoadFriendCards(Context context) { this.context = context; } @Override protected ArrayList<ServerTimeCard> doInBackground(Void... voids) { result = new ArrayList<ServerTimeCard>(); // ...a bunch of data retrieval goes on here... // querying parse for object info // adding a new object to the local ArrayList for all in db for (String friend : friendsListNames) { ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject"); query.whereEqualTo("accountName", friend+"@gmail.com"); query.findInBackground(new FindCallback<ParseObject>() { public void done(List<ParseObject> objects, ParseException e) { if (e == null) { for (ParseObject cardInfo : objects) { ServerTimeCard item = new ServerTimeCard( cardInfo.getString("eventName"), cardInfo.getBoolean("isImage"), cardInfo.getBoolean("isImage"), cardInfo.getBoolean("isVoice")); result.add(item); Log.e("New item called: ", String.valueOf(item.eventNameInput)); Log.e("New size of array...", String.valueOf(result.size())); } } else { Log.d("info", "Error: " + e.getMessage()); } } }); } // returning the new ArrayList<ServerTimeCard> to onPostExecute // PROBLEM: THE SIZE OF THE RESULT IS 0 Log.e("Size of passing array", String.valueOf(result.size())); return result; } @Override protected void onPostExecute(ArrayList<ServerTimeCard> result) { // PROBLEM: This returns 0 Log.e("Data list size: ", String.valueOf(result.size())); // trying to use all objects in the arraylist here but it doesn't work // due to the size. Something isn't passing correctly. } } 

Salida Logcat de Log.e: (que parece que llama doInBackground, luego onPostExecute, luego doInBackground de nuevo)

 E/Size of passing array﹕ 0 E/Data list size:﹕ 0 E/New item called:﹕ yah E/New size of array...﹕ 1 E/New item called:﹕ lplokolol E/New size of array...﹕ 2 E/New item called:﹕ It works E/New size of array...﹕ 3 

SOLVED: Originalmente pensé que necesitaba el AsyncTask pero terminé eliminándolo todo y arrojando todo el código en un método en mi clase principal. Estaba ejecutando demasiadas cosas a la vez en un asynctask y la estructura estaba arrojando datos por todo el lugar. Lección aprendida: manténgala simple.

Su problema es que está utilizando findInBackground para su consulta. Ese método se hace en un hilo de fondo. Así que básicamente ejecuta una tarea asíncrona, dentro de una tarea asíncrona.

  1. doInBackground
  2. findInBackground -> ejecutar de forma asincrónica para ejecutar código sigue
  3. onPostExecute se llama antes de que termine la consulta.
  4. La llamada devuelta se llama para que su consulta llene su lista

Así que lo que necesita hacer en su lugar es utilizar findInBackground fuera de un AsyncTask (ese método está destinado a no ser utilizado en un AsyncTask) o utilizar la función find .

Estás modificando result en una clase interna anónima. Tu código no ve el resultado que crees que ve, sino un cierre. Esta es la raíz del problema.

Estás iniciando un subproceso de fondo (tu tarea asíncrona), y aquí llamas query.findInBackground() varias veces lo que inicia MÁS hilos de fondo. Esto, sin embargo, no es un problema.

Usted está consiguiendo problemas porque el AsyncTask se hace antes de que todos los otros hilos que inició han terminado. Sólo se sabe que los otros subprocesos se realizan cuando se llama a cada método FindCallback hecho ().

Si desea conocer el tamaño correcto, debe codificarlo de manera que compruebe el tamaño en el último método done() .

Usted no tiene que hacer doInBackground para devolver un arraylist que se puede utilizar en onPostExecute. Simplemente devuelva "ok" o "error". Declare y cree un arraylist privado como miembro de su ask. Luego llenarlo en doInBackground y usarlo en onPostexecute.

  • ClassNotFoundException Android
  • Se ha producido un error en la conexión de GoogleApiClient
  • Obtener json de HttpResponse
  • Programaticamente escribir en un dispositivo Android
  • Problemas con la tarjeta SD de Android
  • Usando secciones con fragmentos, NullPointerException
  • Realm: Iterando un RealmObject y borrando un campo ArrayList
  • Android: ¿abro un recurso de archivo cada vez que quiero iniciar sesión
  • Eclipse se congela todo el tiempo con Ubuntu
  • Adición de controles de brillo de pantalla a la aplicación Android
  • XML vs setImageDrawable / setImageBitmap
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.