2012-09-03 16 views
6

Quando ho test sul simulatore, funziona, ma quando prova con il mio dispositivo (galassia s3), mantiene gettando errori, quando, durante il seguente codice:eccezione httpclient.execute Android

HttpResponse response; 
     response = httpclient.execute(httppost); 

le eccezioni:

09-03 08:16:49.018: E/AndroidRuntime(24254): java.lang.RuntimeException: Unable to start activity ComponentInfo{sg.dianping/sg.dianping.activity.ItemListActivity}: android.os.NetworkOnMainThreadException 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread.access$600(ActivityThread.java:128) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.os.Looper.loop(Looper.java:137) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.app.ActivityThread.main(ActivityThread.java:4517) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at java.lang.reflect.Method.invokeNative(Native Method) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at java.lang.reflect.Method.invoke(Method.java:511) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at dalvik.system.NativeStart.main(Native Method) 
09-03 08:16:49.018: E/AndroidRuntime(24254): Caused by: android.os.NetworkOnMainThreadException 
09-03 08:16:49.018: E/AndroidRuntime(24254): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
09-03 08:16:49.018: E/AndroidRuntime(24254): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 

risposta

15

Questa eccezione NetworkingOnMainThread viene generata quando, beh, si esegue l'attività di rete sul thread dell'interfaccia utente. Ha il potenziale di bloccare il thread principale, dal momento che attende che la connessione di rete sia finita prima di riprendere, bloccando così il thread.

Hai 2 opzioni.

1 - Spostare tutta la rete in un thread diverso. La soluzione più comune e facile è AsyncTask Ma ci sono altre opzioni, come ad esempio Handlers. Questa è l'opzione consigliata.

2- È possibile modificare il criterio per consentire il collegamento in rete sul thread dell'interfaccia utente.

basta aggiungere questo codice

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

Questa opzione non è consigliata dato che solo bypassa l'eccezione. L'eccezione viene lanciata per una ragione. Sceglierei la prima opzione Ci sono molti tutorial su come implementare AsyncTask.

Buona fortuna

+0

Risposta perfetta. Non consiglierei il secondo metodo. – Infinity

+0

Grazie, ho trovato anche questo problema, funziona in simulatore perché la versione sdk è Android 2.3. – John

+0

È possibile che in Android 2.3 è stato permesso. Inoltre, per favore considera di accettare la risposta se è quella giusta. Aiuta la comunità. –

Problemi correlati