Android conexión a json / xml api

Estoy tratando de comunicarme con un api de reposo para recuperar un documento JSON, pero cuando ejecuto la aplicación en el emulador Android de Eclipse, la aplicación se cierra tan pronto como se inicia ("Desafortunadamente TestRest se ha detenido"). Parece cerrar debido a la llamada al método httpClient.execute.

El código de la actividad principal se encuentra a continuación:

public class TestRestActivity extends Activity { /** Called when the activity is first created. */ TextView info; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); info = (TextView) findViewById(R.id.debug); String testUri = "http://www.entireweb.com/xmlquery?pz=MYAPIKEY&ip=IP&q=pizza&n=50&format=json"; // print the uri to the screen - (not seen if rest of code runs) info.setText(testUri); HttpClient httpclient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpGet httpget = new HttpGet(testUri); HttpResponse response = null; try { // TODO fails on this line response = httpclient.execute(httpget, localContext); HttpEntity entity = response.getEntity(); if (entity != null) { info.setText("got it"); } } catch (ClientProtocolException e) { // Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // Auto-generated catch block e.printStackTrace(); } finally { } } } 

También he incluido los permisos de la web en mi archivo de manifiesto como se muestra a continuación:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.john.testRes" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.INTERNET" /> 

No muy familiarizado con el desarrollo de Android y realmente desorientado en cuanto a lo que está causando el problema. La API que estoy usando está bien y devuelve el documento json esperado de mi navegador. El AVD que utilizo puede conectarse a Internet en su navegador y he probado la aplicación en varios AVD diferentes.

¿Alguna sugerencia sobre lo que está causando el problema? Gracias.

Editar: errores añadidos

 11-22 18:13:14.221: D/AndroidRuntime(556): Shutting down VM 11-22 18:13:14.221: W/dalvikvm(556): threadid=1: thread exiting with uncaught exception (group=0x409951f8) 11-22 18:13:14.251: E/AndroidRuntime(556): FATAL EXCEPTION: main 11-22 18:13:14.251: E/AndroidRuntime(556): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.john.testRes/org.john.testRes.TestRestActivity}: android.os.NetworkOnMainThreadException 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.access$600(ActivityThread.java:122) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.os.Handler.dispatchMessage(Handler.java:99) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.os.Looper.loop(Looper.java:137) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.main(ActivityThread.java:4340) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.lang.reflect.Method.invokeNative(Native Method) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.lang.reflect.Method.invoke(Method.java:511) 11-22 18:13:14.251: E/AndroidRuntime(556): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 11-22 18:13:14.251: E/AndroidRuntime(556): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 11-22 18:13:14.251: E/AndroidRuntime(556): at dalvik.system.NativeStart.main(Native Method) 11-22 18:13:14.251: E/AndroidRuntime(556): Caused by: android.os.NetworkOnMainThreadException 11-22 18:13:14.251: E/AndroidRuntime(556): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.net.InetAddress.getAllByName(InetAddress.java:220) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.john.testRes.TestRestActivity.onCreate(TestRestActivity.java:41) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.Activity.performCreate(Activity.java:4465) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 11-22 18:13:14.251: E/AndroidRuntime(556): ... 11 more 11-22 18:13:48.321: I/Process(556): Sending signal. PID: 556 SIG: 9 11-22 18:14:01.552: D/AndroidRuntime(597): Shutting down VM 

El problema es que está intentando realizar operaciones de red en el subproceso de interfaz de usuario principal. Necesita hacer esto en un hilo separado. Puede utilizar un AsyncTask o simplemente un Thread estándar.

Aquí hay un ejemplo sencillo:

 final Handler handler = new Handler(); new Thread(new Runnable() { @Override public void run() { // Do something long running handler.post(new Runnable() { @Override public void run() { // Do something on the UI Thread } }); } }).start(); 
  • Android Retrofit sin respuesta
  • Uso de Gson para analizar subclases con diferentes campos
  • Simple analizar JSON de URL en Android y mostrar en listview
  • JSON elemento de verificación Java es un JSONArray o JSONObject
  • Análisis de la cadena JSON en android
  • Android studio no puede resolver import org.json.JSONObject
  • Cómo enviar datos JSON como Cuerpo usando Retrofit android
  • Escribir archivo .json y leer ese archivo en Android
  • Iterando a través de JSONObject
  • Utilizar GSON para analizar un JSON con "clave" dinámica y "valor" en android
  • Forzar a GSON a usar Constructor que contenga Setters o Setters en general, en lugar de Fields
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.