バックグラウンド処理(非同期処理) [Android Studio]
今回は重い処理などの際に進行状況を表示する「ProgressDialog」(プログレスバー付きダイアログ)と「AsyncTask」を使用して非同期処理を行います。
作るもの

事前準備
メニューの[ファイル][新規]の「新規プロジェクト」でプロジェクトを作成します。その時にアクティビティは「空のアクティビティ」を選択します。
※アクティビティ名は「MainActivity」とします
画面設計
Buttonを1つだけ設置してください。
コーディング
import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends AppCompatActivity { // 非同期処理を行うAsyncTaskクラスを継承する // AsyncTaskのジェネリクス<Params,Progres,Result> // Params .. 主にdoInBackgroundの引数型 // Progress .. 主にonProgressUpdateの引数型 // Result .. 主にdoInBackgroundの戻り値 public class MyAsyncTask extends AsyncTask<Object,Integer,Integer>{ private Context context; private ProgressDialog dialog; // コンストラクタ protected MyAsyncTask(Context context) { this.context = context; } // バックグラウンドの処理前 @Override protected void onPreExecute() { // ProgressDialogを生成する dialog = new ProgressDialog(context); dialog.setTitle("進捗状況"); dialog.setMessage("しばらくお待ち下さい。"); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setCancelable(true); // キャンセルボタン以外のキャンセルイベント dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // キャンセルする cancel(true); } }); // キャンセルボタンによるキャンセルイベント dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // キャンセルする cancel(true); } }); dialog.setMax(100); dialog.setProgress(0); dialog.show(); } // バックグラウンド処理 @Override protected Integer doInBackground(Object[] object) { for (int i = 1; i <= 100; i++) { try { // キャンセル時はループを抜ける if (isCancelled()) break; // プログレスバーの処理 publishProgress(i); // なんらかの重い処理 Thread.sleep(50); }catch (Exception e){ e.printStackTrace(); } } return 100; } // バックグラウンドの処理後 @Override protected void onPostExecute(Integer o) { dialog.dismiss(); Log.i("MyTAG", "処理が完了しました。"); } // プログレスバー @Override protected void onProgressUpdate(Integer[] values) { dialog.setProgress(values[0]); } // キャンセル @Override protected void onCancelled() { Log.i("MyTAG","キャンセルされました。"); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 非同期処理の開始 findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MyAsyncTask my = new MyAsyncTask(MainActivity.this); my.execute(); } }); } }
スポンサーリンク
関連記事
公開日:2018年05月20日
記事NO:02659