2011-11-22 12 views
5

Sto provando a comunicare con una pausa API per recuperare un documento JSON, ma quando eseguo l'applicazione nell'emulatore di Eclipse Android l'app si chiude non appena si avvia ("Purtroppo TestRest ha fermato"). Sembra chiudere a causa della chiamata al metodo httpClient.execute.android che si connette a json/xml api

Il codice per l'attività principale è qui sotto:

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 { 
     } 

    } 
} 

Inoltre ho incluso i permessi web nel mio file si manifestano come di seguito:

<?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" /> 

Non troppo familiarità con lo sviluppo di Android e davvero senza tracce su cosa sta causando il problema. L'api che sto usando va bene e restituisce il documento json atteso dal mio browser. L'AVD che sto utilizzando può connettersi a Internet nel suo browser e ho provato l'app su alcuni AVD diversi.

Qualche suggerimento su cosa sta causando il problema? Grazie.

Edit: aggiunte errori

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

si prega di aggiungere la traccia dello stack dell'eccezione che hai dalla tua Logcat – Houcine

+1

E 'quasi impossibile capire senza il registro, ma a prescindere, non si deve fare le chiamate di rete nel thread principale. Cerca di utilizzare [AsyncTasks] (http://developer.android.com/reference/android/os/AsyncTask.html). – dmon

+0

Sono d'accordo con dmon. Non dovresti mai fare chiamate di rete nel thread dell'interfaccia utente (evento). controlla la risposta che ho postato oggi per fare thread di rete in asynctasks http://stackoverflow.com/questions/8224993/loading-image-using-asyn-task/8225107#8225107 – rfsk2010

risposta

8

Il problema è che si sta cercando di fare operazioni di rete sul thread principale dell'interfaccia utente. Hai bisogno di fare questi su un thread separato. È possibile utilizzare uno AsyncTask o solo uno standard Thread.

Ecco un semplice esempio:

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

Grazie per la risposta, ho finito per utilizzare AsyncTask. –

Problemi correlati