TOP > カテゴリ > Java・Android >

バックグラウンド処理(非同期処理) [Android Studio]

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