AndroidでHTTP通信
2年くらい前にAndroidをさわったときは org.apache.http
でHTTPリクエストしていたけど、今は使えなくなっているらしい。
どうやら、OkHttpというのを使うのがイマドキらしい。ので試してみた。
確かに org.apache.http
を使うよりも、超シンプルなコードになるのでいい感じ。以前作った org.apache.http
を簡単に扱えるようにするクラスが用済みになってしまったけど、無事に通信できたので良しとする。
以下、上に書かれた内容と同じだけど自分の作業メモ。
compile 'com.squareup.okhttp:okhttp:2.5.0'
でライブラリを取り込んで、マニフェストファイルで
<uses-permission android:name="android.permission.INTERNET" />
を指定して、以下のコードで通信テスト。リソースファイルは略。
package org.refirio.request;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.IOException;
public class MainActivity extends Activity {
private TextView message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
message = (TextView)this.findViewById(R.id.message);
// データ取得(GET)
Button button_get = (Button)this.findViewById(R.id.button_get);
button_get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
String result = null;
// リクエストオブジェクトを作って
Request request = new Request.Builder()
.url("http://httpbin.org/headers")
.get()
.build();
// クライアントオブジェクトを作って
OkHttpClient client = new OkHttpClient();
// リクエストして結果を受け取って
try {
Response response = client.newCall(request).execute();
result = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
// 返す
return result;
}
@Override
protected void onPostExecute(String result) {
message.setText("Result: " + result);
}
}.execute();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}