androidでは、HTTP通信をするための方法として、下記のふたつがある。
- HttpURLConnection (java.net)
- HttpClient (org.apache.http)
ここでは、HttpClientを使用する方法を紹介する。
HttpURLConnectionとHttpClientの違いについては、下記のサイトが参考になった。
Y.A.M の 雑記帳: Android Apache HTTP Client と HttpURLConnection どっちを使うべき?
HttpURLConnectionを使用する方法は下記を参照。
androidからAsyncTaskLoaderでHTTP-Post通信をする
Http通信処理を実現するためには、Androidアプリで下記の3つの部品を実装する。
- UI処理
- 通信データ
- バックグラウンド処理
Androidアプリのマニフェストファイルにインターネット接続のパーミッションを追加すること。
また、サーバ側でも何らかの応答を返す処理を実装する必要がある。
UI処理
アプリケーション実行時に呼び出されるアクティビティ。
ここで通信データを生成し、バックグラウンド処理に渡す。
package net.kuttya.httppostsample2;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
public class MainActivity extends FragmentActivity implements LoaderCallbacks{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// サーバにデータ送信(初期化)
TransData sendData = new TransData();
Bundle args = new Bundle();
sendData.data = "test";
args.putSerializable("data", sendData);
getSupportLoaderManager().initLoader(0, args, this);
}
public LoaderonCreateLoader(int id, Bundle args) {
if( null != args ) {
TransData sendData = (TransData) args.getSerializable("data");
return new HttpAccesser(this, sendData);
}
return null;
}
public void onLoadFinished(Loaderloader, TransData recvData) {
// AsyncTaskLoaderの処理が終了したら呼び出される
if(null == recvData) {
return;
}
else {
}
}
public void onLoaderReset(Loaderarg0) {
// AsyncTaskLoaderが破棄されるときに呼び出される
}
}
通信データ
実際に使用する通信データはメッセージ種別など様々な情報が含まれていると思うが、ここでは簡略化して文字列のみを送受信することにする。
package net.kuttya.httppostsample2;
import java.io.Serializable;
public class TransData implements Serializable {
private static final long serialVersionUID = 1L;
public String data;
}
バックグラウンド処理
ここでHTTP-Post通信を実行する。
package net.kuttya.httppostsample2;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
public class HttpAccesser extends AsyncTaskLoader{
private final static String SERVER_URL = "http://www.sample.com/index.php";
private final static String ENCODE = "UTF-8";
private TransData mSendData = null; // 送信データ
private DefaultHttpClient mHttpClient = null; // HTTPクライアント
private HttpPost mPost = null; // POST通信
public HttpAccesser(Context context, TransData sendData) {
super(context);
this.mSendData = sendData;
}
public TransData loadInBackground() {
// ここに非同期処理で実施したい処理を記載する
TransData recvData = null;
recvData = send(mSendData);
return recvData;
}
public void onCanceled(Boolean data) {
// キャンセル処理
}
protected void onStartLoading() {
// 開始処理
forceLoad();
}
public TransData send(TransData sendData) {
boolean ret = false;
TransData recvData = null;
Listparams = new ArrayList ();
HttpResponse response = null;
HttpEntity resEntity = null;
int resStatus = 0;
// 接続初期化
ret = initConnection();
if(false == ret) {
return null;
}
try {
// 送信データ生成
params.add(new BasicNameValuePair("data", sendData.data));
// UTF-8にエンコードする
mPost.setEntity(new UrlEncodedFormEntity(params, ENCODE));
// 送信
response = mHttpClient.execute(mPost);
// リクエスト結果を取得
resStatus = response.getStatusLine().getStatusCode();
if(200 == resStatus) {
// リクエスト成功
resEntity = response.getEntity();
recvData = new TransData();
recvData.data = EntityUtils.toString(resEntity, ENCODE);
}
} catch(Exception e) {
e.printStackTrace();
recvData = null;
} finally {
try {
if(mHttpClient != null) {
mHttpClient.getConnectionManager().shutdown();
}
} catch(Exception e) {
recvData = null;
}
}
return recvData;
}
private boolean initConnection() {
mHttpClient = new DefaultHttpClient();
mPost = new HttpPost(SERVER_URL);
return true;
}
}
マニフェストファイルにパーミッション追加
下記のパーミッションを追加する。
0 件のコメント:
コメントを投稿