LoginSignup
9
8

More than 5 years have passed since last update.

Android Httpでデータ取得

Last updated at Posted at 2017-01-31

HTTP通信

前回のボタンでのテキスト変更を一部変更して、
HTTP通信で取得してきたテキストに変更するにようにします。
Android ボタン押下時の動作

TextView_HelloWorld.gif

実装

まず、Manifestにinternet許可の設定を追記します。

AndroidManifest.xml一部抜粋
<?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にセットしています。

AsyncHttpRequest.java
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を引数に指定)

MainActivty.java

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

9
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8