DefaultHttpClient to AndroidHttpClient

Tengo un problema con mi código y esperaba algo de ayuda. Primero estaba usando este código:

new DefaultHttpClient().execute(new HttpGet(linkk)).getEntity().writeTo( new FileOutputStream(f)); 

Y funciona bien en Android 2.3, pero en 4.0 no funciona. Después de algunas investigaciones, escuché que es mejor usar AndroidHttpClient y de esta manera funcionará en 4.0 y 3.1. El problema es que no sé si modifiqué mi código correctamente y no hay demasiados ejemplos sobre AndroidhttpClient en Internet.

Aquí está mi código que se ajustó:

  AndroidHttpClient client = AndroidHttpClient.newInstance("Android"); HttpGet request = new HttpGet(linkk); HttpResponse response = client.execute(request); //here is where the exception is thrown response.getEntity().writeTo(new FileOutputStream(f)); 

Esto es lo que muestra el logcat:

  01-03 01:32:11.950: W/dalvikvm(17991): threadid=1: thread exiting with uncaught exception (group=0x40a2e1f8) 01-03 01:32:11.986: E/AndroidRuntime(17991): FATAL EXCEPTION: main 01-03 01:32:11.986: E/AndroidRuntime(17991): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lacra.fbirthdays/com.lacra.fbirthdays.ListV}: android.os.NetworkOnMainThreadException 01-03 01:32:11.986: E/AndroidRuntime(17991): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 01-03 01:32:11.986: E/AndroidRuntime(17991): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 01-03 01:32:11.986: E/AndroidRuntime(17991): at android.app.ActivityThread.access$600(ActivityThread.java:123) 01-03 01:32:11.986: E/AndroidRuntime(17991): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 01-03 01:32:11.986: E/AndroidRuntime(17991): at android.os.Handler.dispatchMessage(Handler.java:99) 01-03 01:32:11.986: E/AndroidRuntime(17991): at android.os.Looper.loop(Looper.java:137) 01-03 01:32:11.986: E/AndroidRuntime(17991): at android.app.ActivityThread.main(ActivityThread.java:4424) 01-03 01:32:11.986: E/AndroidRuntime(17991): at java.lang.reflect.Method.invokeNative(Native Method) 01-03 01:32:11.986: E/AndroidRuntime(17991): at java.lang.reflect.Method.invoke(Method.java:511) 01-03 01:32:11.986: E/AndroidRuntime(17991): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 01-03 01:32:11.986: E/AndroidRuntime(17991): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 01-03 01:32:11.986: E/AndroidRuntime(17991): at dalvik.system.NativeStart.main(Native Method) 01-03 01:32:11.986: E/AndroidRuntime(17991): Caused by: android.os.NetworkOnMainThreadException 01-03 01:32:11.986: E/AndroidRuntime(17991): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 01-03 01:32:11.986: E/AndroidRuntime(17991): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 01-03 01:32:11.986: E/AndroidRuntime(17991): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 01-03 01:32:11.986: E/AndroidRuntime(17991): at java.net.InetAddress.getAllByName(InetAddress.java:220) 01-03 01:32:11.986: E/AndroidRuntime(17991): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 01-03 01:32:11.986: E/AndroidRuntime(17991): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 01-03 01:32:11.986: E/AndroidRuntime(17991): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 01-03 01:32:11.986: E/AndroidRuntime(17991): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 01-03 01:32:11.986: E/AndroidRuntime(17991): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 

StrictMode.ThreadPolicy se introdujo desde el Nivel 9 de API y la política de subprocesamiento predeterminada se modificó desde API 11, que en resumen, no permite que se ejecute la operación de red (incluir HttpClient y HttpUrlConnection) en el subproceso de UI. si haces esto, obtienes NetworkOnMainThreadException.

Esta restricción se puede cambiar, usando:

  if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } 

Agregue el código anterior en el método onCreate () de su actividad principal.

Además, siempre se recomienda mover la operación de red fuera de la secuencia de la interfaz de usuario , por ejemplo, usando AsyncTask.

espero que esto ayude.

Use una AsyncTask para que la solicitud de red no bloquee el subproceso de UI. La excepción NetworkOnMainThreadException se introdujo desde API versión 11, que es la razón por la que solo aparece 3.0 y más.

 private class NetworkTask extends AsyncTask { @Override protected HttpResponse doInBackground(String... params) { String link = params[0]; HttpGet request = new HttpGet(link); AndroidHttpClient client = AndroidHttpClient.newInstance("Android"); try { return client.execute(request); } catch (IOException e) { e.printStackTrace(); return null; } finally { client.close(); } } @Override protected void onPostExecute(HttpResponse result) { //Do something with result if (result != null) result.getEntity().writeTo(new FileOutputStream(f)); } } 

Para llamar a este hilo simple, haz esto.

 new NetworkTask().execute(linkk); 

Eche un vistazo a este artículo escrito en el sitio para desarrolladores de Android. Explica con más detalle cómo escribir su aplicación para manejar los hilos.