【Android開発】HTTP通信でエラー「NetworkOnMainThreadException」
Android開発HTTP通信をしていたところ、次のエラーが発生。
・NetworkOnMainThreadException
<原因>
Androidでは、HTTP 通信を メイン スレッド(Activityなど)ではなくバックグラウンドの別スレッドで非同期に行う必要があります。
<解決方法>
非同期処理ができるAsyncTaskを使って、HTTP通信をしましょう!
<参考にしたサイト>
こちらのサイトで、AsyncTaskを使った処理方法が書かれています。
AsyncTaskのdoInBackgroundにHTTP通信の処理を書きましょう!
AsyncTaskを使った非同期処理のきほん | Developers.IO
InputStreamをStringに変換する - Qiita
<コード>
public class MainActivity extends AppCompatActivity {
private Button button;
private TextView textView;
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
* ボタンをクリックすると、AsyncTaskで非同期処理を実行します!
*/
AsyncTestTask testTask = new AsyncTestTask();
testTask.execute();
}
});
}
private String TAG_Async = "AsyncTestTask";
private HttpURLConnection urlConnection = null;
private InputStream inputStream = null;
private String result = null;
/*
* AsyncTaskの処理を実行します!
*/
private class AsyncTestTask extends AsyncTask<Void, Integer, String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
/*
* TextViewにURLから取得したテキストをセットします!
*/
textView.setText(result);
}
@Override
protected String doInBackground(Void... voids) {
Log.d(TAG_Async,"doInBackground() is called");
/*
* HTTPResult()メソッドから、URL先のテキストデータを取得します!
*/
result = HTTPResult();
//取得したテキストをログで表示
Log.d(TAG, "result = " + result);
return null;
}
}
/*
* URLからテキストデータを取得するメソッド
*/
protected String HTTPResult() {
try {
//ライブドアの天気予報APIから、岡山県の天気予報を取得します。
URL url = new URL("http://weather.livedoor.com/forecast/webservice/json/v1?city=330010");
//URLConnection処理
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
//タイムアウトの時間を設定
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
urlConnection.connect();
inputStream = urlConnection.getInputStream(); // inputstream から 文字列に変換
result = convertToString(inputStream);
} catch (MalformedURLException e) {
Log.d(TAG, "doInBackground MalformedURLException");
} catch (IOException e) {
Log.d(TAG, "doInBackground IOException" + e.toString());
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
}
}
}
return result;
}
/*
* InputStreamをStringに変換する処理
*/
public String convertToString(InputStream stream) throws IOException {
StringBuffer sb = new StringBuffer();
String line = "";
BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
while ((line = br.readLine()) != null) {
sb.append(line);
}
try {
stream.close();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
}