Android で、HTTP通信を、AsyncTask で実行
仕様は、、、
・GET/POST 指定できること。
・URLパラメータや POST の引数を指定できること。
・ProgressDialog.STYLE_SPINNER を通信中に表示すること。
・抽象メソッドで結果を受けて処理すること。
・ProgressDialog表示中の cancel を対処すること
以下、抽象クラスを書いた。
( AsyncTaskを使うHTTP通信は、以下で書き直した
http://blog.zaq.ne.jp/oboe2uran/article/663/
)
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
/**
* HttpTask.java
*/
public abstract class HttpTask extends AsyncTask<String,Void,byte> implements OnCancelListener{
private boolean progress = false;
private boolean cancel = false;
private Throwable error;
protected abstract void showDialog();
protected abstract void dismissDialog();
protected abstract void doResponse(byte results);
protected abstract void onFailed(Throwable e);
@Override
protected void onPreExecute(){
cancel = false;
progress = true;
showDialog();
}
@Override
protected byte doInBackground(String...params){
byte results = null;
List<NameValuePair> list = new ArrayList<NameValuePair>();
try{
AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
String method = params[0].toUpperCase();
String key=null;
for(int i=2;i < params.length;i++){
if *1;
}
}
HttpResponse response = null;
if (method.equals("GET")){
String url =params.length < 2 ? params[1] : params[1] + "?" + URLEncodedUtils.format(list,"utf-8");
response = client.execute(new HttpGet(url));
}else if(method.equals("POST")){
HttpPost httpPost = new HttpPost(params[1]);
httpPost.setEntity(new UrlEncodedFormEntity(list,"utf-8"));
response = client.execute(httpPost);
}else{
throw new IllegalArgumentException("doInBackground(String...) First parameter must be http protocall");
}
ByteArrayOutputStream stream = new ByteArrayOutputStream();
response.getEntity().writeTo(stream);
if (response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
results = stream.toByteArray();
}
stream.close();
client.close();
}catch(IOException e){
error = e;
cancel = true;
cancel(true);
}
return results;
}
@Override
protected void onPostExecute(byte results){
if (!cancel){
doResponse(results);
}
dismissDialog();
progress = false;
}
@Override
public void onCancel(DialogInterface di){
cancel = true;
this.cancel(true);
}
@Override
protected void onCancelled(){
dismissDialog();
progress = false;
if (error != null){
onFailed(error);
}
}
public boolean isProgress(){
return this.progress;
}
}
---------------------------------------------
実行のサンプルは、以下のように記述、、
public class SampleActivity extends Activity{
HttpTask task;
ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState){
のように、HttpTask と、ProgressDialog を Activity 継承クラスのフィールドにして
参照可能にする。
onCreate の中で実行生成する何かの Widget のクリックリスナーで HttpTask 生成と実行をする。
HttpTask インスタンスは使い切るようにする。
@Override
public void onClick(View view){
task = new HttpTask(){
@Override
protected void showDialog(){
// ダイアログを表示する。cancelable=true を指定している。
dialog = ProgressDialog.show(AsyncHttpSampleActivity.this,"Please wait","通信中...",true,true,task);
}
@Override
protected void dismissDialog(){
// ダイアログを消す
if (dialog != null){
dialog.dismiss();
dialog = null;
}
}
@Override
protected void doResponse(byte results){
// HTTP 通信成功、結果の処理
TextView textView = (TextView)findViewById(R.id.textView1);
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
User user = gson.fromJson(new String(results),User.class);
SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
textView.setText("["+simpleFormat.format(user.date)+"]["+user.userAgent+"]");
}
@Override
protected void onFailed(Throwable e){
// HTTP 通信失敗時の処理
*2.setText("error");
}
};
// HTTP-POST 実行
task.execute("POST",getString(R.string.targetUrl),"id","1204");
}