AndroidのHandler(ハンドラー)とは?ProgressDialogで進捗を表示する実装例を解説
AndroidのHandler(ハンドラー)とは
Androidでは、バックグラウンドスレッドからメインスレッド(UIスレッド)を直接操作することができません。そこで重要な役割を果たすのがHandlerです。Handlerは、メインスレッド上のイベントをキューに集め、それをLooperクラスへ順番に渡すことで、スレッド間の通信を実現します。
Android開発において、Handlerは主に「バックグラウンドスレッドからメインスレッド(UI)を更新する」ために使用されます。代表的なメソッドは次の2つです。
- post():Looperを介して、バックグラウンドスレッドからメインスレッドへ処理(Runnable)を投稿します。
- sendMessage():UIへ送信した内容(バックグラウンドスレッドからのメッセージ)やUI処理を整理・制御したい場合に使用します。
本記事では、ProgressDialogとHandlerを組み合わせて進捗状況を表示する方法を、サンプルコード付きで解説します。
手順1:新規プロジェクトを作成する
Android Studioを起動し、「File ⇒ New Project」を選択して、必要な項目を入力しながら新しいプロジェクトを作成します。
手順2:レイアウトファイルを編集する
res/layout/activity_main.xml に以下のコードを追加します。
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android = "https://schemas.android.com/apk/res/android"
xmlns:app = "https://schemas.android.com/apk/res-auto"
xmlns:tools = "https://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity">
<Button
android:id = "@+id/button"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Click"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintLeft_toLeftOf = "parent"
app:layout_constraintRight_toRightOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
</android.support.constraint.ConstraintLayout>
手順3:MainActivity.javaを編集する
src/MainActivity.java に以下のコードを追加します。
import android.app.ProgressDialog;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Handler mHandler;
ProgressDialog mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(this);
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
notificationDialog();
break;
}
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void notificationDialog() {
mHandler=new Handler();
mProgressBar= new ProgressDialog(MainActivity.this);
mProgressBar.setMax(100);
mProgressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressBar.show();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
final int currentProgressCount = i;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Update the value background thread to UI thread
mHandler.post(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress(currentProgressCount);
}
});
}
}
}).start();
}
}
なお、ProgressDialogはAPIレベル26以降で非推奨(deprecated)となっています。最新の開発ではProgressBarやDialogFragmentの利用が推奨されるため、学習の際はその点もあわせて覚えておくと良いでしょう。
アプリを実行してみよう
それでは、アプリケーションを実行してみましょう。ここでは、実際のAndroid端末がパソコンに接続されているものとします。Android Studioからアプリを実行するには、プロジェクト内のいずれかのアクティビティファイルを開き、ツールバーの実行アイコンをクリックします。デバイス選択画面で自分のスマートフォンを選択すると、端末にデフォルト画面が表示されます。

上記のボタンをタップすると、以下のようにProgressDialogが表示され、バックグラウンドスレッドの処理に合わせて進捗バーが少しずつ更新されていきます。

-
BlueStacks(ブルースタックス)は本当に安全?セキュリティ・性能・合法性を徹底解説
Androidエミュレーターの中で最も人気があると言われる「BlueStacks」。しかし、他のエミュレーターと比べても、なぜか「本当に安全なのか?」という不安の声が絶えないことでも知られています。安全だと感じているユーザーもいれば、実際に使用した経験からセキュリティ上の懸念を抱いた人もいるのが現実です。BlueStacksとは何か?専門用語を使わずに説明すると、BlueStacksはPCやMac向けの無料Androidエミュレーターで、現在この分野で最大のシェアを誇っています。Androidエミュレーターとは、本来スマートフォンやタブレット向けに設計されたAndroidアプリやゲームを、デス
-
【2022年版】PCで使えるAndroid OSおすすめ12選|エミュレータの仕組みも徹底解説
Googleが開発したAndroidは、スマートフォンやタブレット向けに設計された、世界で最も利用されているOSのひとつです。アプリの作成からダウンロード、インストールまで柔軟に行える利便性の高さから、「PCでもAndroidを使いたい」と考える人は少なくありません。実際、エミュレータソフトやAndroidベースのOSを活用すれば、WindowsパソコンやノートPCでもAndroidアプリやゲームを快適に動かせます。 本記事では、PCで使えるおすすめのAndroid OS・エミュレータを12個厳選して紹介します。まずは、これらのツールがどのような仕組みで動作しているのかを理解しておきましょう