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
.
- Opencv Android: java.lang.UnsatisfiedLinkError: dlopen falló: no se pudo cargar la librería "libopencv_java.so"
- 500 Error interno de la solicitud HTTP POST
- Pasar un ArrayList de cualquier tipo a un método
- vuforia AR SDK - no se puede reproducir video por url
- Cómo eliminar el fondo de una vista (normal) (Android)
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 aonPostExecute
-
Salida actual : El
ArrayList<ServerTimeCard>
enonPostExecute
tiene un tamaño de cero cuando el mismo arraylist endoInBackground
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.
- Android GPS no funciona hasta que se reinicie en nuevos teléfonos
- Parsing data for Android L failed.Unsupported major.minor versión 51.0
- Android - Mientras maneja una imagen es mejor almacenarla o usarla en memoria temporal?
- No se puede leer socket InputStream en Jelly Bean
- Cómo comparar una cadena de Intent.getStringExtra ()?
- ¿Existen bibliotecas similares al proyecto Three20 para Android?
- Cómo convertir jpg a pdf en Android java
- Android obtener la miniatura de vídeo PATH, no Bitmap
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.
-
doInBackground
-
findInBackground
-> ejecutar de forma asincrónica para ejecutar código sigue -
onPostExecute
se llama antes de que termine la consulta. - 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.
- ACTION_SEND – Compartir archivo con nombre de archivo diferente que en disco
- Excluir o anular un manifiesto AAR