![]() |
|
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
«
Tema Anterior
|
Siguiente tema
»
|
Herramientas |
#1
|
||||
|
||||
Pasar varios String de doInBackground a onPostExecute
Cuando paso un solo String en una clase AsyncTask no tengo problemas:
protected String doInBackground(String... args) { HashMap<String, String> params = new HashMap<String, String>(); params.put(TAG_PID, pidArte); JSONObject json = jsonParser.makeHttpRequest(url_arte, "POST", params); try { int success = json.getInt(TAG_SUCCESS); if (success == 1) { apartados = json.getJSONArray(TAG_APARTADOS); for (int m = 0; m < apartados.length(); m++) { JSONObject c = apartados.getJSONObject(m); // Poner cada json item en una variable String nombre = c.getString(TAG_NOMBRE); return nombre; } } } catch (JSONException e) { e.printStackTrace(); } return null; } protected void onPostExecute(String nombre) { pDialog.dismiss(); delegate.processFinish(nombre); } Pero cuando tengo que pasar varios string utilizo el siguiente código que fundamentalmente consiste en poner los string obtenidos de json en un HashMap<String, String> map, pasar el HashMap a onPostExecute y allí recuperar los valores de los string por su clave: class ArteGeneralDetails extends AsyncTask<String, String, HashMap<String, String>> { … protected void onPreExecute() { … protected HashMap<String, String> doInBackground(String... args) { HashMap<String, String> map = new HashMap<String, String>(); HashMap<String, String> params = new HashMap<String, String>(); params.put(TAG_PID, pidArte); JSONObject json = jsonParser.makeHttpRequest(url_arte, "POST", params); try { int success = json.getInt(TAG_SUCCESS); if (success == 1) { apartados = json.getJSONArray(TAG_APARTADOS); for (int m = 0; m < apartados.length(); m++) { JSONObject c = apartados.getJSONObject(m); // Poner cada json item en una variable String nombre = c.getString(TAG_NOMBRE_ARTE); String icono2 = c.getString(TAG_IMAGEN_ARTE); map.put(TAG_NOMBRE_ARTE, nombre); map.put(TAG_IMAGEN_ARTE, icono2); //return map; } } } catch (JSONException e) { e.printStackTrace(); } return map; } protected void onPostExecute(HashMap<String, String> resultados) { pDialog.dismiss(); String nombre=resultados.get(TAG_NOMBRE_ARTE); Toast.makeText(getApplicationContext(), nombre, Toast.LENGTH_LONG).show(); } En el Toast no sale valor alguno para nombre. Si alguien puede indicarme algo sobre cómo solucionarlo se lo agradecería. Última edición por Joakin60 Día 04/06/16 a las 12:54:37 |
|
#3
|
||||
|
||||
¿TAG_NOMBRE y TAG_NOMBRE_ARTE es lo mismo que le has cambiado el nombre?
Mira a ver si te está saltando la excepción del try-catch |
#4
|
||||
|
||||
Pasar varios String de doInBackground a onPostExecute
Lo primero gracias por responder.
Sí. Antes era: //JSON Node names private static final String TAG_NOMBRE = "nombre"; y ahora es: private static final String TAG_NOMBRE_ARTE = "nombre"; Haciendo un debug en try salta de: String icono2 = c.getString(TAG_IMAGEN_ARTE); a: catch (JSONException e) Se come: map.put(TAG_NOMBRE_ARTE, nombre); map.put(TAG_IMAGEN_ARTE, icono2); Última edición por Joakin60 Día 04/06/16 a las 15:31:21 |
#5
|
||||
|
||||
Pues ya lo tienes resuelto entonces, en el JSON no hay ningún atributo que se llame TAG_IMAGEN_ARTE y salta una excepción en el getString(). Bien porque has escrito mal la variable o porque realmente en el JSON no existe tal atributo.
Al contrario que en un Map que lo normal es devolver null si no existe, al leer de un JSON salta excepción, así que tienes que comprobar antes si existe el atributo con c.has(TAG_IMAGEN_ARTE). En caso de existir lo lees con c.getString igual y en caso de no existir ya queda a tu criterio (o le das un valor por defecto en plan "" o le das el valor null o simplemente no lo añades al hashmap) Algo así: [PHP]String icono2 = c.has(TAG_IMAGEN_ARTE) ? c.getString(TAG_IMAGEN_ARTE) : null;[/PHP] (eso es lo mismo que decir: si existe el atributo, léelo, si no dale el valor null) Última edición por mocelet Día 04/06/16 a las 15:37:06 |
#6
|
||||
|
||||
Resuelto problema
Efectivamente de nuevo, ha sido un empane, es:
private static final String TAG_IMAGEN_ARTE = "icono2"; en vez de: private static final String TAG_IMAGEN_ARTE = "imagen"; Con esto ya tengo para rato y dejarte descansar, otra vez muchas gracias. PD: Se me olvidaba, he leído buscando lo de HashMap, que en éste no se pueden poner valores que sean null, supongo que esto tiene fácil solución poniendo un condicional (if (valor!=null)). Última edición por Joakin60 Día 04/06/16 a las 16:18:52 |
#7
|
||||
|
||||
Lo que no puede/debe ser null es la clave (tampoco es que tenga sentido que una key sea null porque tienen que ser únicas), el valor puede ser null perfectamente.
Otra cosa es para qué guardar algo cuyo valor es null, para eso mejor no guardarlo desde un principio. Última edición por mocelet Día 04/06/16 a las 16:40:16 |
#8
|
||||
|
||||
Es lo lógico, pero mira lo que he leido en:
http://jarroba.com/map-en-java-con-ejemplos Los elementos que inserta en el map no tendrán un orden específico. No aceptan claves duplicadas ni valores nulos. |
#9
|
||||
|
||||
Nuevamente, hablan de la clave, no del valor asociado a una clave. Puedes hacer un map.put("nombre", null) perfectamente. Cuando hagas get("nombre") te devolverá null.
Y, en efecto, no es que no se admitan duplicadas, es que cada vez que haces un put sustituyes el valor asociado a la clave que indiques. Puedes hacer un put("nombre", "adan") y acto seguido un put("nombre", "eva"), no te va a dar ningún error, pero cuando hagas el get("nombre") te devolverá "eva" que es lo último que guardaste con esa clave. |
Gracias de parte de: | ||
#10
|
||||
|
||||
Entendido
Muy bien explicado. Gracias de nuevo.
Deberían haber dicho: No aceptan claves duplicadas ni claves nulos. Última edición por Joakin60 Día 04/06/16 a las 17:17:04 |
Respuesta |
![]() |
||||||
|
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 21:31:19 (GMT +2)
HTCMania: líderes desde el 2007