バックグラウンド処理(非同期処理) [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
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









