このページの本文へ

前へ 1 2 3 4 5 次へ

これで作れる! Androidのアプリケーション 第8回

Androidアプリに必要なダイアログを作る

2010年08月20日 12時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

別スレッドで処理して
メインスレッドではダイアログを表示する

 このため、ProgressDialogを使うためには、時間のかかる処理を別スレッドで実行させ、メインスレッドでは、ProgressDialogを表示させるといった構造を作る必要があります。ここだけを見ると、ダイアログを表示させるのに別スレッドを作るのは、本末転倒な感じもしますが、ANRを起動させないためにも別スレッド化が必要だし、GUI側で画面を更新(ProgressDialogはアニメーションが動作する)させるためにも必要な構造なのです。

 以下のリストは、タイムゾーンのリストを都市名順に並び変える部分のコードです。EditItem.javaの464行目からに相当します。タイムゾーンのリストはかなりの数が定義されており、並び変えには少し時間がかかるため、別スレッド(DoSort)で実行させ、その間にProgressDialogを表示しています。

private void imsort(){
  dialog = new ProgressDialog(this);
  dialog.setIndeterminate(true);
  dialog.setMessage(myS(R.string.sort_wait));
  dialog.show();
  tmpsort = new DoSort(handler,this);
  tmpsort.start();
}

private class DoSort extends Thread {
  private Handler handler;
  private final Runnable listener;
  public DoSort(Handler _handler, Runnable _listener){
    this.handler = _handler;
    this.listener = _listener;
  }
  @Override
  public void run()
  {
    WorldClock.myTimeZoneData.sort_by_city();
    handler.post(listener);
  }
}

 スレッドはjavaのスレッドです。Threadクラスを継承するDoSortクラスを作り、その中のrunメソッドに処理を記述します。

 このコードが別スレッドで実行されているとき、メインスレッドは、ProgressDialogを呼び出している状態です。これを止めなければなりません。このためのコードが「handler.post(listener);」です。前述のように別スレッドからは、GUI操作を行なうことはできません。ということは、ProgressDialogを止めることもできないのです。サブスレッド自体は、処理が終われば停止しますが、何らかの方法で、GUIを表示させているメインスレッドを実行させないと、ダイアログを止めることができないのです。ところが、メインスレッドはProgressDialogのshow()を実行した状態なので、アプリケーションには戻ってきていない状態になっています。

 そこでHandlerを使って、ProgressDialog.show()を実行中のメインスレッドに割り込みをかけて、ダイアログを止めるような処理を行なわせているのです。実際には、EditItem.javaの454行目にあるrunメソッドが呼び出されます。

public void run(){
  MyListAdapter arrayAdapter = new MyListAdapter(this,WorldClock.myTimeZoneData.getTimeZoneDb());
  arrayAdapter.setCityNameMode(true);
  tzlist.setAdapter(arrayAdapter);
  tzlist.invalidate();
  tzlist.setSelection(WorldClock.myTimeZoneData.blute_search(getTimeZone()));
  dialog.dismiss();
}

 というのは、listnerには、自分自身(this)が指定してあるからです。実はEditItemは、ActivityであるとともにRunnableでもあります。51行目の宣言では、

public class EditItem extends Activity implements Runnable

としてあります。

 Runnableであるthisに対して、Handler.post(listener)を実行すると、EditItemクラスのrunメソッド(DoSortクラスにもrunメソッドがあることに注意)が実行されるわけです。

 本当は、thisを使わずに別途Runnableクラスを作り、そのなかにrunメソッドと同等な処理を記述しておいて、これをスレッドに引数として渡し、スレッド内でHandler.postメソッドを使って起動するというのが、正しいやり方なのでしょうが、スレッドはここ1つだけでもあり、記述を簡単にするためにEditItemをRunnableにしてしまいました。

 Handlerクラスは、Androidのオブジェクトです。内部にキューを持っていて、キューに入ったRunnableなオブジェクトを順番にメインスレッドで実行するものです。これが用意されているのは、前述のようにメインスレッドだけがGUI操作が可能なため、今回のProgressDialogのような操作を別スレッドから行なうためなのです。

 では、上のリストからEditItemクラスのrunメソッドを見てみましょう。ここでは、EditItemにあるリストを更新して、最後にdialog.dismiss()を実行しています。dialogは、ProgressDialogなので、これで表示されているProgressDialogが止まり、メインスレッドに戻ってきます。

 さて、次回はAndroidのGUIパーツの中でも一番複雑なListViewについて解説する予定です。

前へ 1 2 3 4 5 次へ

カテゴリートップへ

本記事はアフィリエイトプログラムによる収益を得ている場合があります

この連載の記事
1
Apple 2026 MacBook Air M5チップ搭載13インチノートブック:AIとApple Intelligence、13.6インチLiquid Retinaディスプレイ、16GBユニファイドメモリ、512GB SSDストレージ、12MPセンターフレームカメラ、日本語キーボード、Touch ID - スカイブルー
Apple 2026 MacBook Air M5チップ搭載13インチノートブック:AIとApple Intelligence、13.6インチLiquid Retinaディスプレイ、16GBユニファイドメモリ、512GB SSDストレージ、12MPセンターフレームカメラ、日本語キーボード、Touch ID - スカイブルー
¥176,566
2
【整備済み品】富士通 ARROWS Tab V727/V 12.3型 WUXGA+ タブレットPC Windows11 Pro MS Office H&B 2019 第7世代 Core m3-7Y30 メモリ4GB SSD128GB LTE対応 無線LAN Webカメラ タッチペン付属 USB-C 初期設定済み 中古パソコン
【整備済み品】富士通 ARROWS Tab V727/V 12.3型 WUXGA+ タブレットPC Windows11 Pro MS Office H&B 2019 第7世代 Core m3-7Y30 メモリ4GB SSD128GB LTE対応 無線LAN Webカメラ タッチペン付属 USB-C 初期設定済み 中古パソコン
¥9,999
3
Apple 2026 MacBook Neo A18 Proチップ搭載13インチノートブック:AIとApple Intelligenceのために設計、Liquid Retinaディスプレイ、8GBユニファイドメモリ、256GB SSDストレージ、1080p FaceTime HDカメラ - ブラッシュ
Apple 2026 MacBook Neo A18 Proチップ搭載13インチノートブック:AIとApple Intelligenceのために設計、Liquid Retinaディスプレイ、8GBユニファイドメモリ、256GB SSDストレージ、1080p FaceTime HDカメラ - ブラッシュ
¥98,789
4
ESBOOKノートパソコン 【MS Office 2024搭載&Windows 11 Pro】14インチIPS液晶/1920×1080FHDディスプレイ カメラ付き/薄型PCノート高性能CPU/初期設定不要/8Gメモリ/無線LAN/大容量SSD/初心者向け・パソコンノート/日本語キーボードフィルム付き/ワイヤレスマウス付き(256G SSD, ローズゴールド)
ESBOOKノートパソコン 【MS Office 2024搭載&Windows 11 Pro】14インチIPS液晶/1920×1080FHDディスプレイ カメラ付き/薄型PCノート高性能CPU/初期設定不要/8Gメモリ/無線LAN/大容量SSD/初心者向け・パソコンノート/日本語キーボードフィルム付き/ワイヤレスマウス付き(256G SSD, ローズゴールド)
¥38,999
5
【Amazon.co.jp限定】Dell ノートパソコン Dell 15 DC15250 15.6インチ Intel Core i5-1334U メモリ16GB SSD512GB Windows 11 カーボンブラック 翌営業日対応オンサイト出張修理サービス1年(HDD返却不要サービス) ND65-GHBA
【Amazon.co.jp限定】Dell ノートパソコン Dell 15 DC15250 15.6インチ Intel Core i5-1334U メモリ16GB SSD512GB Windows 11 カーボンブラック 翌営業日対応オンサイト出張修理サービス1年(HDD返却不要サービス) ND65-GHBA
¥104,980

Amazonのアソシエイトとして、ASCII.jpは適格販売により収入を得ています。

ASCII倶楽部

注目ニュース

  • 角川アスキー総合研究所

プレミアム実機レビュー

ピックアップ
1
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
¥2,649
2
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
¥990
3
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
¥740
4
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ホワイト T-K6A-2630WH
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ホワイト T-K6A-2630WH
¥1,690
5
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GW
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GW
¥1,548
6
UGREEN USB Type Cケーブル PD対応 100W/5A 超急速充電 USB C ナイロン編み 断線防止 iphone17/16/15シリーズ/iPad/MacBook Pro/Galaxy S24/Matebook/iPad/Xperia等USB-C各種対応(1m, ブラック)
UGREEN USB Type Cケーブル PD対応 100W/5A 超急速充電 USB C ナイロン編み 断線防止 iphone17/16/15シリーズ/iPad/MacBook Pro/Galaxy S24/Matebook/iPad/Xperia等USB-C各種対応(1m, ブラック)
¥743
7
バッファロー マウス 無線 ワイヤレス 5ボタン 【戻る/進むボタン搭載】 小型 軽量 節電モデル 最大584日使用可能 BlueLED ブラック BSMBW315BK
バッファロー マウス 無線 ワイヤレス 5ボタン 【戻る/進むボタン搭載】 小型 軽量 節電モデル 最大584日使用可能 BlueLED ブラック BSMBW315BK
¥1,040
8
NIMASO ガラスフィルム iPad 第11世代(A16) 2025用/iPad 10.9インチ 第10世代 2022用 衝撃吸収 強化 ガラス 保護フィルム 指紋防止 ガイド枠付き NTB22I574
NIMASO ガラスフィルム iPad 第11世代(A16) 2025用/iPad 10.9インチ 第10世代 2022用 衝撃吸収 強化 ガラス 保護フィルム 指紋防止 ガイド枠付き NTB22I574
¥1,358
9
キヤノン Canon 純正 インクカートリッジ BCI-381(BK/C/M/Y)+380 5色マルチパック BCI-381+380/5MP 長さ:5.3cm 幅:13.9cm 高さ:10.75cm
キヤノン Canon 純正 インクカートリッジ BCI-381(BK/C/M/Y)+380 5色マルチパック BCI-381+380/5MP 長さ:5.3cm 幅:13.9cm 高さ:10.75cm
¥5,645
10
【Amazon.co.jp限定】バッファロー 外付けハードディスク 4TB テレビ録画/PC/PS4/4K対応 バッファロー製nasne™対応 静音&コンパクト 日本製 故障予測 みまもり合図 HD-AD4U3
【Amazon.co.jp限定】バッファロー 外付けハードディスク 4TB テレビ録画/PC/PS4/4K対応 バッファロー製nasne™対応 静音&コンパクト 日本製 故障予測 みまもり合図 HD-AD4U3
¥17,980

Amazonのアソシエイトとして、ASCII.jpは適格販売により収入を得ています。

デジタル用語辞典

ASCII.jpメール デジタルMac/iPodマガジン