読者です 読者をやめる 読者になる 読者になる

まっしろけっけ

めもてきなやーつ

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