今や通信機能がないアプリを探す方が難しいくらいどのアプリでも通信をサポートしている。
今回はAndroidで通信をやってみよう。
1.マニュフェストにインターネットの許可を記述する。</manifest>の1行上にでも挿入すればよい。
●AndroidManifest.xml(uses_permissionの1行を挿入する)

</application>
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

インターネットの許可をマニュフェストに追記しなければならない。
この作業を忘れて通信が出来ないという事態を過去に何百回と見てきた。
とても忘れやすいので注意が必要だ。

2.MainActivityに以下を記述する。

package com.example.mjpurin.httplesson1;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    private StringBuilder sb=new StringBuilder();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //メインスレッド通信できないのでスレッドを1本つくる
        new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    URL url=new URL("http://joytas.net/works/");
                    HttpURLConnection con=(HttpURLConnection)url.openConnection();
                    con.setRequestMethod("GET");
                    InputStream is=con.getInputStream();
                    InputStreamReader isr=new InputStreamReader(is,"UTF-8");
                    BufferedReader br=new BufferedReader(isr);
                    String line;
                    while((line = br.readLine()) != null){
                        sb.append(line);
                    }
                    Log.d("RESULT",sb.toString());

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
}

Logcatに「Joytas Serverへようこそ!」と表示されれば成功だ。

http://joytas.net/works/
というURLにリクエストを投げてレスポンスとして帰ってきた文字列をlogcatに表示したわけだ。
ためしに上記URLをWebブラウザで見てみてほしい、同様の文字列が出力されるはずだ。

処理自体は定形的なのだが、一点注意すべき点がある。それはAndroidでの通信はメインスレッドで行うことが出来ないということだ。なので新たにスレッドを生成して、そちらで通信処理を行っている。
「通信みたいな重い処理は裏でやれ!」
ということだ。
(スレッドの基本がわからない人はJava39回を参考にしてほしい)

Androidの通信の基本を学んだところで練習問題をやってみよう。
Q1
 http://joytas.net/works/calc.php?x=10&y=20
にAndroidからリクエストを投げてレスポンスとして帰ってくる
10と20の和は30です。
という文言をlogcatに表示せよ。
確認したら10と20の部分を好きな数字にして結果がどうかわるか試してみよう。

package com.example.mjpurin.httplesson1;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    private StringBuilder sb=new StringBuilder();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //メインスレッド通信できないのでスレッドを1本つくる
        new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    URL url=new URL("http://joytas.net/works/calc.php?x=10&y=20");
                    HttpURLConnection con=(HttpURLConnection)url.openConnection();
                    con.setRequestMethod("GET");
                    InputStream is=con.getInputStream();
                    InputStreamReader isr=new InputStreamReader(is,"UTF-8");
                    BufferedReader br=new BufferedReader(isr);
                    String line;
                    while((line = br.readLine()) != null){
                        sb.append(line);
                    }
                    Log.d("RESULT",sb.toString());

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
}