#HTTP通信
前回のボタンでのテキスト変更を一部変更して、
HTTP通信で取得してきたテキストに変更するにようにします。
※Android ボタン押下時の動作
#実装
まず、Manifestにinternet許可の設定を追記します。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.qiita.qiita">
<uses-permission android:name="android.permission.INTERNET" />
AndroidのメインスレッドでHTTP通信を実行すると
「NetworkOnMainThreadException」の例外が発生します。
その為、別のスレッドで実行する必要があります。
今回はAsyncTaskを継承して実装します。
###AsyncTaskの主な処理
上から順に呼び出されます。
####・onPreExecute()
メインスレッドで実行され、非同期処理の前処理
####・doInBackground()
非同期で処理したい内容を記述します。abstractメソッドの為、実装が必須。
####・onProgressUpdate()
メインスレッドで実行されます。
doInBackground()で、publishProgress()が呼ばれた場合に処理されます。
進捗状況などをプログレスバーで表示する際などに使用します。
####・onPostExecute()
doInBackgroundメソッドの実行後にメインスレッドで実行されます。
doInBackgroundメソッドの戻り値をこのメソッドの引数として受け取ります。
AsyncTaskの引数は<doInBackgroundの引数,onProgressUpdateの引数,onPostExecuteの引数>となっています。
ここでは
doInBackgroundで引数のURLを使用してHTTPリクエストを実施し、結果を戻り値とします。
onPostExecuteにて戻り値をTextViewにセットしています。
package com.example.qiita.qiita;
import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class AsyncHttpRequest extends AsyncTask<String, Void, String> {
private Activity mActivity;
public AsyncHttpRequest(Activity activity) {
mActivity = activity;
}
@Override
protected String doInBackground(String... params) {
HttpURLConnection connection = null;
StringBuilder sb = new StringBuilder();
try {
URL url = new URL(params[0]);
connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String line = "";
while ((line = reader.readLine()) != null)
sb.append(line);
is.close();
} catch (IOException e) {
e.printStackTrace();
} finally{
connection.disconnect();
}
return sb.toString();
}
public void onPostExecute(String string) {
((TextView)mActivity.findViewById(R.id.textview)).setText(string);
}
}
Activityは前回のテキストを変更しているリスナーを変更をして、
AsyncHttpRequestを呼び出します。(Hello world!!を返却するだけのURLを引数に指定)
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AsyncHttpRequest(self).execute("https://xxxxxxx.herokuapp.com/xxxx/");
}
});
###Developers
・AsyncTask
https://developer.android.com/reference/android/os/AsyncTask.html