PDA

Ver la Versión Completa : [ SOLUCIONADO ] Se cierra la aplicación después de ejecutar AsyncTask


Joakin60
19/08/16, 14:49:59
Estoy realizando una prueba de actualizar campos en una base de datos, pero al ejecutar la AsyncTask en la aplicación me cierra esta después de actualizar los campos de la base de datos, y no se me ocurre a que puede deberse. Aquí dejo el código por si alguien puede ayudarme.
class ArteActualizarRating extends AsyncTask<String, String, String> {

override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Espere por favor ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}

protected String doInBackground(String... args) {
pidArte ="107-75-1";
nvotosFin="5";
valoracionFin="10";
// Building Parameters
HashMap<String, String> params = new HashMap<String, String>();
params.put(TAG_PID, pidArte);
params.put(TAG_NVOTOS_FIN, nvotosFin);
params.put(TAG_VALORACION_FIN, valoracionFin);

JSONObject json = jsonParser.makeHttpRequest(url_arte,
"POST", params);

try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully updated
Intent i = getIntent();
// send result code 100 to notify about product update
setResult(100, i);
finish();
} else {
// failed to update
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String par) {
pDialog.dismiss();
}
}
Gracias de antemano por las respuestas.

mocelet
19/08/16, 15:15:55
Cuando se cierra una app no hay que mirar el código, hay que mirar la excepción en el Logcat.

¿Qué excepción te da?

Joakin60
19/08/16, 15:25:37
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(F utureTask.java:352)
at java.util.concurrent.FutureTask.setException(Futur eTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.jav a:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTas k.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:838)
Caused by: java.lang.NullPointerException
at libcore.net.UriCodec.encode(UriCodec.java:132)
at java.net.URLEncoder.encode(URLEncoder.java:57)
at com.example.variablebd.JSONParserGeneral.makeHttpR equest(JSONParserGeneral.java:39)
at com.example.variablebd.MainActivity$ArteActualizar Rating.doInBackground(MainActivity.java:63)
at com.example.variablebd.MainActivity$ArteActualizar Rating.doInBackground(MainActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.jav a:234)
... 4 more
Activity com.example.variablebd.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$Decor View{41458658 V.E..... R......D 0,0-513,144} that was originally added here
android.view.WindowLeaked: Activity com.example.variablebd.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$Decor View{41458658 V.E..... R......D 0,0-513,144} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:409)
at android.view.WindowManagerGlobal.addView(WindowMan agerGlobal.java:218)
at android.view.WindowManagerImpl.addView(WindowManag erImpl.java:69)
at android.app.Dialog.show(Dialog.java:281)
at com.example.variablebd.MainActivity$ArteActualizar Rating.onPreExecute(MainActivity.java:52)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.j ava:586)
at android.os.AsyncTask.execute(AsyncTask.java:534)
at com.example.variablebd.MainActivity.onCreate(MainA ctivity.java:38)
at android.app.Activity.performCreate(Activity.java:5 122)
at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1081)
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2270)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2358)
at android.app.ActivityThread.access$600(ActivityThre ad.java:156)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1340)
at android.os.Handler.dispatchMessage(Handler.java:99 )
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.jav a:5297)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:600)
at dalvik.system.NativeStart.main(Native Method)

mocelet
19/08/16, 16:22:00
Caused by: java.lang.NullPointerException
at libcore.net.UriCodec.encode(UriCodec.java:132)
at java.net.URLEncoder.encode(URLEncoder.java:57)
at com.example.variablebd.JSONParserGeneral.makeHttpR equest(JSONParserGeneral.java:39)
at com.example.variablebd.MainActivity$ArteActualizar Rating.doInBackground(MainActivity.java:63)

Pues tiene toda la pinta de que la URL que estás pasando (url_arte) es null

Joakin60
19/08/16, 21:27:16
No, la url no puede ser null puesto que los campos nvotos y valoración de la tabla correspondiente a los String nvotosFin y valoracionFin los actualiza conforme a su pidArte.
Lo que pasa es que ejecuta la aplicación, actualiza los datos y luego el problema, se cierra.
He estado y sigo dándole vueltas a ver si el AsyncTask está mal construido, pero no veo en qué, tampoco tiene tanto.

mocelet
19/08/16, 21:36:58
Pues entonces es null algo de la línea 39 de tu clase JsonParserGeneral, mira a ver qué haces en esa línea.

Joakin60
19/08/16, 23:26:05
El JSONParser que estoy utilizando es el que se puede encontrar en cualquier sitio de internet, de echo lo estoy utilizando en otros sitios para seleccionar y mostrar campos de la base de datos y funciona bien.
La línea a que te refieres es:
sbParams.append(key).append("=")
.append(URLEncoder.encode(params.get(key), charset));
Y está dentro del contexto:
sbParams = new StringBuilder();
int i = 0;
for (String key : params.keySet()) {
try {
if (i != 0){
sbParams.append("&");
}
sbParams.append(key).append("=")
.append(URLEncoder.encode(params.get(key), charset));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
i++;
}
No entiendo bien este código, por lo que no puedo saber si está bien o no.

mocelet
19/08/16, 23:55:46
Pues el problema lo tienes en el params que le pasas, que hay algo que está mal y al hacer el get de la clave correspondiente devuelve null porque no existe. Lo más seguro es que sean null pidArte, nvotos, valoracion o alguno de esos que has puesto.

Comprueba que estás pasando bien los parámetros que necesite.

Joakin60
20/08/16, 10:44:10
Al final estaba mal el código de asyntask. Queda así y funciona perfectamente. Muchas gracias de nuevo por tu ayuda.
Sobra el Intent. Y de paso una última pregunta ¿Cómo doy un tema por cerrado?

JSONObject json = jsonParser.makeHttpRequest(url_arte,
"POST", params);

try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
/* Intent i = getIntent();
setResult(100, i);
finish();*/
} else {
// failed to update
}
} catch (JSONException e) {
e.printStackTrace();
}

mocelet
20/08/16, 10:53:42
Ya es raro que se solucione una excepción comentando algo que viene después xD Pero si funciona bienvenido es jaja.

Puedes editar el mensaje, no recuerdo si edición avanzada, y en el desplegable de tipo de hilo elegir Solucionado.

Dexafree
21/08/16, 10:58:26
Marcado queda como Solucionado :ok:

Para que un usuario marque su propio hilo como solucionado, debe editar el post inicial del hilo, ir a Edición Avanzada, y ahí se puede cambiar la etiqueta :ok: