2011-01-27 10 views
13

En mi código que tienen estaHonyComb y DefaultHttpClient

 Log.d("WFlog (executeRequest)", request.toString()) ; 
     httpResponse = client.execute(request); 
     Log.d("WFlog (execute)", request.toString()) ; 

ejecutar la aplicación usando Android 2.2 va bien y en Logcat que ver ambas líneas de registro.

Ahora ejecutando la aplicación usando HonyComb para la misma pieza de código, parece que nunca me pasan el client.exe correctamente. La última línea de registro que obtengo es la que tiene "WFlog (executeRequest)".

Después de esto ver lo siguiente:

01-27 21:54:45.169: WARN/System.err(390): android.os.NetworkOnMainThreadException 
01-27 21:54:45.196: WARN/System.err(390):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1069) 
01-27 21:54:45.196: WARN/System.err(390):  at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:368) 
01-27 21:54:45.205: WARN/System.err(390):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208) 
01-27 21:54:45.215: WARN/System.err(390):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431) 
01-27 21:54:45.237: WARN/System.err(390):  at java.net.Socket.connect(Socket.java:901) 

Cualquier idea de lo que debería tener en cuenta?

Respuesta

32

Existen nuevas políticas que permiten a los desarrolladores de aplicaciones y sistemas operativos establecer expectativas de rendimiento para la ejecución de código en ciertos subprocesos. Intentó invocar las API de bloqueo en el hilo de la interfaz de usuario de su aplicación. Google ha implementado un sistema que le permite saber que esta es una mala idea y puede resolver este problema ejecutando su solicitud en un hilo separado o asyncTask.

Por favor, lea this publicación en el blog. Puede encontrar información sobre cómo hacer aplicaciones asíncronas/multiproceso en SO y Google.

+0

Gracias por señalar a la entrada del blog. Después de leer esto y basándome en la reescritura de mi aplicación, ahora está funcionando. Fue el asyncTask quien me ayudó en esto. Así que gracias por tu ayuda en esto. –

5

Gracias Nick. Funcionó para mí Con fines dev me acaba de establecer la política de Tema por defecto al hacer esto

*ThreadPolicy tp = ThreadPolicy.LAX; 
StrictMode.setThreadPolicy(tp);* 

Esto se debe quitar para la versión final. sugerencia

3

de abhinaw escrito como la reflexión, por lo que el código también funciona en versiones anteriores del API:

try { 
     Class strictModeClass=Class.forName("android.os.StrictMode"); 
     Class strictModeThreadPolicyClass=Class.forName("android.os.StrictMode$ThreadPolicy"); 
     Object laxPolicy = strictModeThreadPolicyClass.getField("LAX").get(null); 
     Method method_setThreadPolicy = strictModeClass.getMethod(
       "setThreadPolicy", strictModeThreadPolicyClass); 
     method_setThreadPolicy.invoke(null,laxPolicy); 
    } catch (Exception e) { 

    } 

Sí, esto debería ser eliminado para la versión final.

3

Utilicé una asynctask, la vi en otros hilos, y funcionó bien ... creo una subclase en la que quería llamar a la conexión de red. no sé si es la mejor manera, pero este código funcionó para mí ....

public miclase{ 

    public boolean comprobarMP3(int canal){ 
     boolean retorno=true; 
     //This commented Code is what it was NOT working 
     //swr= new ServicioWebRest(); 
     //contenido=swr.obtieneContenido(Channels.getInstance().getChannel().get(canal).getId()); 
     try{ 
      //this.get() was important, i had troubles in recovering the objet, .get() solved it 
      contenido=new getContenidoAsync().execute(canal).get(); 
     }catch(Exception e){ 
      contenido=null; 
     } 
    } 

    //Clase interna para acceder a los webservice de un modo asincrono en otro hilo 
    //Desde el sdk 11, las politicas de seguridad de android no permiten acceder a internet desde el hilo principal 
    public class getContenidoAsync extends AsyncTask<Integer, Void, Contenido>{ 
     Contenido c=new Contenido(); 

     @Override 
     protected Contenido doInBackground(Integer... urls) { 
     //aqui el codigo q sea, yo llamo a este que llama a otra clase que es el q llama a http 
      return new ServicioWebRest().obtieneContenido(Channels.getInstance().getChannel().get(urls[0]).getId()); 
     } 

     @Override 
     protected void onPostExecute(Contenido result) { 
      c=result; 
     }  
    } 
} 
Cuestiones relacionadas