PDA

Ver la Versión Completa : [ CONSULTA ] Out of memory


pozako
17/11/14, 16:06:10
Buenas tardes,

Tengo un problema en mi app y estoy intentando recoger de mi bd mysql unos registros haciendo una llamada asynctask a un php que tengo y devolviendo estos registros en un JSON, el problema es que si sobrepaso los 2900 registros, la app se me queda sin memoria y me presenta el siguiente error en el Log de eclipse "out of memory", quisiera saber si hay alguna forma de solucionarlo de otra forma o algún método de liberación de memoria.

Un saludo!!

kriogeN
17/11/14, 19:24:36
La máquina Dalvik sólo es capaz de administrar de 30 a 50 MB (dependiendo del móvil) a la vez en una única aplicación. Si luego por cada registro vas creando un objeto, si es posible que se te pete la memoria por eso.

¿La solución? Pues depende de como uses esos registros, si es para mostrarlos en un RecyclerView (antiguos ListView) puedes hacer la petición al PHP por páginas.

pozako
17/11/14, 20:48:40
¿A que te refieres con hacer la petición por páginas?

kriogeN
17/11/14, 21:28:14
Pasarle un parámetro al PHP que te indique que página quieres traerte, y cada petición al PHP te trae una página.

Por ejemplo:

consulta.php?pagina=1
consulta.php?pagina=2

Y luego en el MySQL traer por ejemplo de 25 en 25, usando LIMIT al final de la consulta, de tal forma que:

página 1: LIMIT 0,25
página 2: LIMIT 25,25
página 3: LIMIT 50,25
etc...

pozako
18/11/14, 09:38:55
Entiendo xD, es que por lo de páginas pensé que te referías en views, probaré a ver que tal, muchas gracias!! :gracias:

pozako
20/11/14, 13:25:18
Perdonad pero a lo mejor no me he explicado bien, mi caso es que tengo un solo php en el cual hace una consulta a mi base de datos mySQL para recoger los datos de esa consulta.
Desde la app hago la llamada a ese php pasandole la consulta que ha de realizar, esta me devuelve los datos, los recojo en un JSON y los inserto en la base de datos de mi app SQLite.
El problema es que todo va fenomenal pero cuando los registros a devolver exceden de 2900, salta el error Out of memory. Dice que el hilo principal está haciendo mucho trabajo... he probado a limpiar los objetos segun los termino de usar igualandolos a null y luego llamando al metodo System.gc() para que los limpie pero no hay manera :S

Dexafree
20/11/14, 16:27:29
Dice que el hilo principal está haciendo mucho trabajo... he probado a limpiar los objetos segun los termino de usar igualandolos a null y luego llamando al metodo System.gc() para que los limpie pero no hay manera :S

:pensando:

Esa parte la haces dentro del AsyncTask? En el doInBackground() ?

Si la haces en el onPostExecute se ejecuta en el hilo principal, con lo cual si que te puede petar.

También, aparte de limitar la consulta en tu script PHP tal y como te dice Kriogen, puedes probar a dividir los registros en, digamos, paquetes de 1000, e irlos insertando progresivamente

pozako
21/11/14, 11:55:09
Mirad este es el código:
productos = new AsyncHttpClient();
productos.setTimeout(3600000);
RequestParams parametros = new RequestParams();
parametros.put("consulta", "SELECT * FROM tabla");
productos.post(CONSULTAINSTALL, parametros, new JsonHttpResponseHandler() {
@Override
public void onSuccess(JSONArray jsonArray) {

new CopyTable_productos().executeOnExecutor(executorSe rvice,jsonArray);

}
});
El fallo segun el depurador de eclipse lo encuentro en la linea
productos.post(CONSULTAINSTALL, parametros, new JsonHttpResponseHandler()

kriogeN
21/11/14, 14:16:15
Tiene que construir un JSONArray de 2900 elementos, cada uno de ellos siendo un JSONObject y posiblemente con más JSONArray y JSONObject dentro de cada uno. Es posible que te pete por memoria.

pozako
24/11/14, 12:28:01
¿Y veis alguna forma de recogerlo sin que petara la memoria?

kriogeN
24/11/14, 12:32:14
Ya te lo he dicho antes, paginando.

O puedes recoger el String del JSon y parsearlo tu mismo poco a poco, pero me sigue pareciendo mejor paginar.

pozako
27/11/14, 10:32:20
Buenos Días!

Siento comunicar que probé por paginado, y sigue dando el error de "out of memory", así que la única forma que me queda probar es recogiendo el String JSON y parseandolo.
El problema es...¿Como puedo recoger ese String?

pozako
01/12/14, 11:45:21
Finalmente lo he solucionado leyendo un fichero sql y ejecutando linea a linea la sentencias SQL y me va perfecto, muchas gracias por su tiempo!!