2013-03-19 12 views
5

HTTPを接続するコードはここにあります。HttpURLConnectionが例外をスローしています

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

これは助けてくださいandroid.os.NetworkOnMainThreadException

を投げています。

+3

コードをAsyncTaskに移動すると、問題が解決されます。チェック[android.os.NetworkOnMainThreadException](http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – Sajmon

答えて

24

メインUIスレッドでネットワークコールを行っているため、android.os.NetworkOnMainThreadExceptionが発生します。代わりにasynctaskを使用します。

asynctaskのドキュメント。 http://developer.android.com/reference/android/os/AsyncTask.html

UIスレッドでAsyncTaskを呼び出します。

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

:AsyncTaskは、スレッドとハンドラの周りのヘルパークラスになるように設計されており、一般的なスレッド化フレームワークを構成するものではありません。 AsyncTasksは理想的には短い操作(数秒以内)に使用するのが理想的です。スレッドを長時間実行し続ける必要がある場合は、java.util.concurrent pacakgeによって提供されるさまざまなAPIを使用することを強くお勧めします。 Executor、ThreadPoolExecutor、およびFutureTaskです。

robospiceでのasynctaskの代替手段。 https://github.com/octo-online/robospice

robospiceの機能の一部です。

1.バックグラウンドAndroidServiceネットワークリクエスト(例:Spring Androidを使用したRESTリクエスト)で非同期に実行します。

2が強く型付けされています! POJOを使用してリクエストを行い、リクエスト結果としてPOJOを取得します。

3.要求に使用されるPOJOやプロジェクトで使用するアクティビティクラスのいずれに対しても制約を適用しない。

4.JsonでJacksonとGson、Xml、フラットテキストファイル、バイナリファイル、ORM Liteを使用しても結果はキャッシュされます。

は、ネットワーク要求の結果のあなたの活動(またはその他のコンテキスト)を5.notifies場合、彼らはまだ生きている場合にのみ

すべてで、Androidのローダーのようなメモリリーク6.no

、アンドロイドAsyncTasks通知とは異なり、あなたのUIスレッド上のあなたの活動。

7.単純で強力な例外処理モデルです。

+0

私は 'MyDownloadTask()と思う。execute(); 'は' new MyDownloadTask()。execute(); 'にする必要があります。説明的な答えは+1。 –

+0

はい。ごめんなさいタイプミス。それを固定した。 – Raghunandan

4

NetworkOnMainThreadException:アプリケーションがメインスレッドでネットワーク操作を実行しようとしたときにスローされる例外。

asynctaskでsendfeedbackメソッドを呼び出すと、上記のコードだけが動作します。 Webサーバーが応答に時間がかかるので、メインスレッドは応答しなくなります。これを避けるには、別のスレッドで呼び出す必要があります。したがって、asynctaskが優れています。

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

関連する問題