Android  HTTP通信を AsyncTaskで

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");
}

*1:i % 2)==0){
            key = params[i];
         }else{
            list.add(new BasicNameValuePair(key,params[i]

*2:TextView)findViewById(R.id.textView1