2011-11-22 15 views
5

Estoy tratando de comunicarse con una API REST para recuperar un documento JSON, pero cuando corro la aplicación en el emulador Eclipse Android la aplicación se cierra en cuanto se inicia ("Desafortunadamente TestRest tiene detenido"). Parece cerrarse debido a la llamada al método httpClient.execute.androide conectar con el API JSON/XML

El código para la actividad principal es el siguiente:

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 web en mi archivo de manifiesto de la siguiente manera:

<?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 familiarizados con el desarrollo de Android y realmente desorientado en cuanto a qué está causando el problema. La API que estoy usando está bien y devuelve el documento json esperado de mi navegador. El AVD que estoy usando se puede conectar a Internet en su navegador y he probado la aplicación en algunos AVD diferentes.

¿Alguna sugerencia sobre qué está causando el problema? Gracias.

Edit: añadido errores

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 
+0

favor añadir el seguimiento de la pila de la excepción de que usted tiene de su LogCat – Houcine

+1

Es casi imposible averiguar sin el registro, pero a pesar de que no debe estar haciendo llamadas de red en el hilo principal. Examine el uso de [AsyncTasks] (http://developer.android.com/reference/android/os/AsyncTask.html). – dmon

+0

Estoy de acuerdo con dmon. Nunca debe hacer llamadas de red en el subproceso UI (evento). compruebe la respuesta que publiqué hoy para hacer los hilos de la red en asynctasks http://stackoverflow.com/questions/8224993/loading-image-using-asyn-task/8225107#8225107 – rfsk2010

Respuesta

8

El problema es que usted está tratando de hacer operaciones de red en el hilo principal interfaz de usuario. Necesitas hacer esto en un hilo separado. Puede usar un AsyncTask o solo un estándar Thread.

Aquí está 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(); 
+1

Gracias por la respuesta, terminé usando AsyncTask. –