androidでのHTTP通信でNetworkOnMainThreadExceptionにはまった件
ちょっと前にはまったやーつ
※今回は接続状態の確認等は省きます
AndroidManifestを更新
+ <uses-permission android:name="android.permission.INTERNET" />
HTTP通信の処理を作成
MainActivityを編集
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); HttpURLConnection connection = null; try { URL url = new URL("http://hoge.jp"); connection = (HttpURLConnection) url.openConnection(); InputStream is = connection.getInputStream(); StringBuilder src = new StringBuilder(); while (true) { byte[] line = new byte[1024]; int size = is.read(line); if (size <= 0) break; src.append(new String(line, "utf-8")); } } catch (IOException e) { e.printStackTrace(); } finally{ connection.disconnect(); } }
これでアプリを実行すると「connection.getInputStream();」落ちてしまう。
NetworkOnMainThreadExceptionって言われた。
色々ググってたらこちらにたどり着きました。
たしかに4.2系でデバッグしていた。
ということで非同期処理にすることにした。
非同期処理でHTTP通信
HTTP通信は予測不能な遅延を含む可能性があるのでUIThread 実施しないほうがいいそうです。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - HttpURLConnection connection = null; - try { - URL url = new URL("http://hoge.jp"); - connection = (HttpURLConnection) url.openConnection(); - InputStream is = connection.getInputStream(); - StringBuilder src = new StringBuilder(); - while (true) { - byte[] line = new byte[1024]; - int size = is.read(line); - if (size <= 0) - break; - src.append(new String(line, "utf-8")); - } - } catch (IOException e) { - e.printStackTrace(); - } finally{ - connection.disconnect(); - } + new MyAsync(this).execute("http://hoge.jp"); }
続いてMyAsync.javaを作成
public class MyAsync extends AsyncTask<String, Void, String> { private Activity mActivity; public MyAsync(Activity activity) { mActivity = activity; } @Override protected String doInBackground(String... params) { HttpURLConnection connection = null; StringBuilder src = new StringBuilder(); try { URL url = new URL(params[0]); connection = (HttpURLConnection) url.openConnection(); InputStream is = connection.getInputStream(); while (true) { byte[] line = new byte[1024]; int size = is.read(line); if (size <= 0) break; src.append(new String(line, "utf-8")); } } catch (IOException e) { e.printStackTrace(); } finally{ connection.disconnect(); } return new String(src); } public void onPostExecute(String string) { TextView textView = (TextView) mActivity.findViewById(R.id.responce); textView.setText(string); } }
だいぶ適当ですがこんな感じ
これで実行すればExceptionを投げられずresponseを取得出来るはずです。