2012年7月24日火曜日

Threadの利用方法:AsyncTask、ProgressDialog



import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class AndroidAsyncTaskActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 }

 public void buttonClick(View v) {
  Log.d("タグ", "ボタンがクリックした。!");

  new MyAsyncTask(this).execute("Param1");
 }

 public class MyAsyncTask extends AsyncTask<String, Integer, Long> implements OnCancelListener {

  private Context context;
  private ProgressDialog dialog;

  public MyAsyncTask(Context context) {
   // TODO 自動生成されたコンストラクター・スタブ
   this.context = context;
  }

  @Override
  protected void onPreExecute() {
 // タスク開始前処理:UIスレッドで実行される
   //進捗ダイアログの表示
   Log.d("TAG", "onPreExecute");
   dialog = new ProgressDialog(context);
   dialog.setTitle("しばらくお待ちください");
   dialog.setMessage("データ読み込み中...");
   dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
   dialog.setCancelable(true);// ProgressDialog のキャンセルが可能かどうか  
   dialog.setOnCancelListener(this);
   dialog.setMax(100);
   dialog.setProgress(0);
   
    // ProgressDialog の Cancel ボタン  
   dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "キャンセル", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
     // ProgressDialog をキャンセル
     dialog.cancel();
    }
   });  
   dialog.show();
  }

  @Override
  protected Long doInBackground(String... params) {
// 別スレッドで実行する処理
   Log.d("", "doInBackground ::" + params[0]);//doInBackground ::Param1

   try {
    for (int i = 0; i < 10; i++) {
     if (isCancelled()) {
      Log.d("", "Cancelled!");
      break;
     }
     Thread.sleep(1000);
     publishProgress((i + 1) * 10);
    }
   } catch (InterruptedException e) {
    Log.d("", "InterruptedException in doInBackground");
   }
   return 999L;
  }
  
  // プログレスバー更新処理: UIスレッドで実行される
  @Override
  protected void onProgressUpdate(Integer... values) {
   
   Log.d("", "onProgressUpdate ::" + values[0]);
   dialog.setProgress(values[0]);
  }

  @Override
  protected void onCancelled() {
   Log.d("", "onCancelled");
   dialog.dismiss();
  }

  @Override
  protected void onPostExecute(Long result) {
// タスク終了後処理:UIスレッドで実行される
   Log.d("", "onPostExecute :: " + result);//doInBackground のリターン
   // 進捗ダイアログをクローズ
   dialog.dismiss();
  }

  public void onCancel(DialogInterface dialog) {
   Log.d("", "Dialog onCancell... calling cancel(true)");
   this.cancel(true);
  }

 }

}

07-23 20:52:59.493: D/(12475): onProgressUpdate ::50
07-23 20:53:00.509: D/(12475): onProgressUpdate ::60
07-23 20:53:01.163: D/(12475): Dialog onCancell... calling cancel(true)
07-23 20:53:01.163: D/(12475): InterruptedException in doInBackground
07-23 20:53:01.173: D/(12475): onCancelled

関連記事

0 件のコメント:

コメントを投稿