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を取得出来るはずです。