2013-03-19 17 views
5

Ecco il mio codice per connettere HTTP.HttpURLConnection lancia l'eccezione

URL url = new URL("http://www.google.com"); 
       HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
       con.setDoOutput(true); 
       String responseMsg = con.getResponseMessage(); 
       int response = con.getResponseCode(); 

questo sta gettando android.os.NetworkOnMainThreadException

prega di aiuto.

+3

spostare il codice in AsyncTask, che possa risolvere il problema. controllare [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – Sajmon

risposta

24

android.os.NetworkOnMainThreadException si verifica perché si sta effettuando una chiamata di rete sul thread principale dell'interfaccia utente. Usa invece un asynctask.

Documentazione di asynctask. http://developer.android.com/reference/android/os/AsyncTask.html.

Chiama AsyncTask nel thread UI.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    new MyDownloadTask().execute(); 

} 

class MyDownloadTask extends AsyncTask<Void,Void,Void> 
{ 


    protected void onPreExecute() { 
     //display progress dialog. 

} 
    protected Long doInBackground(Void... params) { 
      URL url = new URL("http://www.google.com"); 
      HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
      con.setDoOutput(true); 
      String responseMsg = con.getResponseMessage(); 
      int response = con.getResponseCode(); 
    return null; 
} 



protected void onPostExecute(VOid result) { 
    // dismiss progress dialog and update ui 
} 
} 

Nota: AsyncTask è progettato per essere una classe di supporto intorno Discussione e Handler e non costituisce un quadro filettatura generica. AsyncTasks dovrebbe idealmente essere utilizzato per operazioni brevi (pochi secondi al massimo). Se è necessario mantenere i thread in esecuzione per lunghi periodi di tempo, si consiglia vivamente di utilizzare le varie API fornite dal jaku.util.concurrent pacakge come Esecutore, ThreadPoolExecutor e FutureTask.

Un'alternativa a asynctask in robospice. https://github.com/octo-online/robospice.

Alcune delle funzionalità di robospice.

1.esecuisce le richieste di rete in modo asincrono (in background AndroidService) (es: richieste REST utilizzando Spring Android).

2.è fortemente digitato! Esegui le tue richieste usando i POJO e ottieni POJO come risultati delle richieste.

3. non applicare alcun vincolo né sui POJO utilizzati per le richieste né sulle classi di attività utilizzate nei progetti.

4.cache risultati (in Json sia con Jackson e Gson, o Xml, o file di testo flat, o file binari, anche utilizzando ORM Lite).

5.notifies vostre attività (o di qualsiasi altro contesto) del risultato della richiesta di rete se e solo se sono ancora vivi

6.no perdita di memoria a tutti, come Android Caricatori, a differenza AsyncTasks Android Notifica le tue attività sul loro thread UI.

7. utilizza un modello di gestione delle eccezioni semplice ma affidabile.

+0

Penso a 'MyDownloadTask().execute(); 'dovrebbe essere' new MyDownloadTask(). execute(); '. +1 per la risposta descrittiva. –

+0

sì. scusa errore di battitura. aggiustato. – Raghunandan

4

NetworkOnMainThreadException: l'eccezione che viene generata quando un'applicazione tenta di eseguire un'operazione di rete sul thread principale.

È necessario chiamare il metodo sendfeedback su asynctask, quindi funzionerà solo sopra il codice. Poiché il server web impiega molto tempo per rispondere, il thread principale non risponde. Per evitarlo dovresti chiamarlo su un altro thread. Quindi asynctask è migliore.

http://android-developers.blogspot.in/2009/05/painless-threading.html