2011-03-15 16 views
14

Tengo una actividad que muestra una vista de lista. Al hacer clic en un elemento, se inicia una segunda actividad que ejecuta una AsyncTask que recupera una URL remota según el elemento al que se hace clic, analiza los resultados y luego los muestra en otra vista de lista. Mientras se ejecuta la tarea asíncrona, tengo una vista de "carga" que solo muestra una imagen y texto. El problema es si inicio la actividad que ejecuta la tarea asincrónica, luego presiono hacia atrás y comienzo otra instancia de dicha actividad, obtengo una fuerza cercana.Android: manejo del botón Atrás durante asynctask

He tratado

private class getlist extends AsyncTask implements OnDismissListener{ 
    ... 
    @Override 
    public void onDismiss(DialogInterface arg0) { 
      this.cancel(true); 
    } 
}

pero el problema persiste.

También han puesto

 
if(!isCancelled()){ 
    setContentView(R.layout.list); 
    ... 
    etc. 

} 

en mi llamada onPostExecute, pero tampoco esto no impide que la vista se encienda, o el problema es otra cosa.

Logcat muestra "hoja de vida inesperada, mientras que ya se reanudó .. obtuve RemoteException enviar setActive (falsa) de notificación" A continuación, un poco más abajo en el registro, "java.net.SocketTimeoutException: socket no está conectado"

Cómo puedo resolver esto?

actualización:

 
E/AndroidRuntime(19379): Uncaught handler: thread AsyncTask #2 exiting due to uncaught exception 
E/AndroidRuntime(19379): java.lang.RuntimeException: An error occured while executing doInBackground() 
E/AndroidRuntime(19379):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
E/AndroidRuntime(19379):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
E/AndroidRuntime(19379):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
E/AndroidRuntime(19379):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
E/AndroidRuntime(19379):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
E/AndroidRuntime(19379):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
E/AndroidRuntime(19379):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
E/AndroidRuntime(19379):  at java.lang.Thread.run(Thread.java:1096) 
E/AndroidRuntime(19379): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(19379):  at com.metatroid.android.swim.ThreadViewer.getPosts(ThreadViewer.java:153) 
E/AndroidRuntime(19379):  at com.metatroid.android.swim.ThreadViewer$getlist.doInBackground(ThreadViewer.java:70) 
E/AndroidRuntime(19379):  at com.metatroid.android.swim.ThreadViewer$getlist.doInBackground(ThreadViewer.java:1) 
E/AndroidRuntime(19379):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
E/AndroidRuntime(19379):  at java.util.concurrent.FutureTask$Sync.innerRun
+0

Su error, si está leyendo LogCat correctamente, no tiene nada que ver con esto, sino que es un problema de red cuando intenta descargar los datos. – CommonsWare

+0

@CommonsWare - He actualizado la pregunta con lo que creo que es el rastro correcto – aperture

Respuesta

38

La solución real a este problema era utilizar ThreadSafeClientConnManager para la ClientConnectionManager

por ejemplo

 
BasicHttpParams params = new BasicHttpParams(); 
SchemeRegistry schemeRegistry = new SchemeRegistry(); 
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); 
schemeRegistry.register(new Scheme("https", sslSocketFactory, 443)); 
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 
DefaultHttpClient httpclient = new DefaultHttpClient(cm, params); 
+2

Encontró una "java.lang.IllegalStateException: el adaptador está desacoplado". al intentar conectar con el servidor. Este enfoque lo solucionó. Gracias –

+0

Tuve el mismo problema y ahora está arreglado, gracias. ¿Puedes explicar cómo surgió esta solución? porque me parece un parche y es algo interesante. gracias de nuevo. – Rami

+0

Tuve Java.lang.IllegalException. Resuelto por esto – Hema

6

no acceden a la actividad de doInBackground(). Sólo es seguro para acceder a la actividad en onPostExecute(), publishProgress(), o onPreExecute(), e incluso entonces sólo con un poco de cuidado para manejar los cambios de configuración, etc.

Yo recomendaría que usted hace getlist ser una clase interna estática, en lugar de una clase interna regular. Asociar manualmente la tarea y la actividad, y romper esa asociación cuando se destruye la actividad o se cambia su configuración. Su onPostExecute() y su familia deberían verificar que tenga una actividad válida antes de intentar usarlo.

This sample application demuestra parte de esto - manejando el cambio de configuración. No maneja explícitamente el escenario del botón ATRÁS, pero no lo necesita, ya que simplemente actualiza una actividad que está fuera de la pantalla.

En términos de por qué getPosts() tiene una NullPointerException, eso depende de usted para determinar.

+0

Gracias. Trataré de descubrir cómo hacerlo. Tengo aproximadamente cuatro días de experiencia en Java, por lo que estoy luchando para hacer algo bastante extraño. La NullPointerException estaba apuntando a una línea en la que estaba configurando la cadena de título de mi tarea de fondo.Eliminar esa línea todavía me deja un error, pero ahora dice en logcat: "IllegalStateException: No wrapped connection" o "IllegalStateException: Adapter is detached" – aperture

+0

@aperture: si solo tiene cuatro días de experiencia Java, va a sé * forma * sobre tu cabeza con las cosas de las que estás hablando aquí. Sin ofender, pero esto será confuso para los experimentados desarrolladores de Java y Android. Es posible que desee comenzar con un proyecto más simple desde el principio. – CommonsWare

+0

Bueno, todo está funcionando muy bien aparte de este problema. Puedo cambiar entre otras actividades que también usan asynctasks sin problema, e incluso puedo cambiar entre esta actividad problemática si espero unos segundos antes de lanzar la siguiente instancia. Y, por supuesto, si espero a que 'getPosts()' termine antes de que abandone la actividad, no hay problema. Aunque entiendo, soy muy inexperto con Java. – aperture

Cuestiones relacionadas