CodeZine(コードジン)

特集ページ一覧

アクティビティ実装時の勘どころ
~速習! Androidアプリケーション開発(5)~

第5回 アクティビティの実装その1

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/01/27 14:00
目次

非同期処理を実現する仕組みAsyncTask

 Android 1.5から非同期処理を実現する仕組みとしてAsyncTaskが用意されています。AsyncTaskはジェネリッククラスになっており、型パラメータとして、Params、Progress、Resultの3つのパラメータを渡す必要があり、それぞれ下記を指定します。

AyncTaskの型パラメータ
型パラメータ 説明
Params バックグランドで実行する処理への引数(doInBackground()の引数)の型を指定します。
Progress 進捗を表わす型を指定します。
Result バックグラウンドで実行した結果の型(doInBackground()の戻り値の型)を指定します。
AsyncTaskのメソッド
メソッド 説明
onPreExecute() バックグラウンドの処理(doInBackground())の前にUIスレッドから呼び出されます。通常はここで進捗のダイアログの表示を行います。
doInBackground() バックグラウンドで実行する処理。非UIスレッドから呼び出されます。進捗を進める場合は、publishProgress()を呼び出します。
onProgressUpdate() publishProgres()を呼ぶとUIスレッドから呼び出されます。通常はここでダイアログの進捗を進めます。
onPostExecute() バックグランドでの処理(doInBackground())終了後にUIスレッドから呼び出されます。通常はここで結果を画面に反映する処理を行います。
onCancelled(); AsyncTaskのcancel()を呼ぶとUIスレッドで呼び出されます。

 AsyncTaskを利用して一覧データの取得~表示を非同期処理に置き換えると、次のようなイメージになります。

/**
 * アクティビティが前面に来るたびにデータを更新
 */
@Override
protected void onResume() {
	super.onResume();

	// データ取得タスクの実行
DataLoadTask task = new DataLoadTask();
task.execute();
}

/**
* 一覧データの取得と表示を行うタスク
*/
public class DataLoadTask extends AsyncTask<Object, Integer, List<BizCard>> {
// 処理中ダイアログ
private ProgressDialog progressDialog = null;

@Override
protected void onPreExecute() {
// バックグラウンドの処理前にUIスレッドでダイアログ表示
progressDialog = new ProgressDialog(ListActivity.this);
progressDialog.setMessage(getResources().getText(
R.string.data_loading));
progressDialog.setIndeterminate(true);
progressDialog.show();
}

@Override
protected List<BizCard> doInBackground(Object... params) {
// 一覧データの取得をバックグラウンドで実行
BizCardDao dao = new BizCardDao(ListActivity.this);
return dao.list();
}

@Override
protected void onPostExecute(List<BizCard> result) {
// 処理中ダイアログをクローズ
progressDialog.dismiss();

// 表示データのクリア
arrayAdapter.clear();

// 表示データの設定
for (BizCard bizCard : result) {
arrayAdapter.add(bizCard);
}
}
}

 また、新たな文字列が必要になったので「res/values/strings.xml」に下記の定義を追加します。

<string name="data_loading">データを取得しています</string>
処理中表示
処理中表示

Listenerを使って参照画面への遷移機能を追加

 続いて、一覧から要素がクリックされたイベントを拾って、参照画面へ遷移する機能を追加します。

 イベント処理はGUIプログラミングの経験がある人であればおなじみのListenerを利用して実現します。先ほどのソースに下記の太字部分の処理を追加してください。アクティビティ自体がListenerを実装している事に違和感を覚える人もいると思いますが、こうすることで若干メモリの節約ができます。ソースが読みづらくならない範囲で、このように実装するのが望ましいです。

 また、onItemClick()でIntentを使用していますが、アプリケーション内の画面遷移はこのように遷移先のクラスを指定してインテントを作成し、必要な情報を設定してアクティビティを開始します。

public class ListActivity extends Activity implements OnItemClickListener{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        :
        :中略
        :
        
        // リスナの追加
listView.setOnItemClickListener( this);
} : :中略 : /**
* List要素クリック時の処理
*
* 選択されたエンティティを詰めて参照画面へ遷移する
*/
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 選択された要素を取得する
BizCard bizCard = (BizCard)parent.getItemAtPosition( position);
// 参照画面へ遷移する明示的インテントを生成
Intent showIntent = new Intent( this, ShowActivity.class);
// 選択されたオブジェクトをインテントに詰める
showIntent.putExtra( BizCard.TABLE_NAME, bizCard);
// アクティビティを開始する
startActivity( showIntent);
}
}

新規登録画面への遷移を追加

 さらにオプションメニューから新規登録画面への遷移も追加しましょう。オプションメニューは[Menu]ボタンが押された際に表示されるメニューで、アクティビティごとに設定します。

 オプションメニューもレイアウト同様、ソースコードから追加する事もできますが、こちらもXMLで作成するのが一般的です。「res」配下に「menu」というディレクトリを作成し、「list.xml」という名前で次の内容のファイルを新規に作成します。

list.xml
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 新規メニュー -->
    <item
        android:id="@+id/menu_new"
        android:title="@string/menu_new"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

 今後使うものも含め、メニュー用の文字列を「res/values/strings.xml」に追加します。

<string name="menu_new">新規</string>
<string name="menu_save">保存</string>
<string name="menu_edit">編集</string>
<string name="menu_delete">削除</string>

オプションメニューを実装

 続いて、ListActivity.javaにオプションメニュー設定の記述を追加します。オプションメニューの設定は、onCreateOptionsMenu()をオーバーライドして行います。

/**
 * オプションメニューの生成
 */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    // XMLで定義したmenuを指定する。
    inflater.inflate(R.menu.list, menu);
    return true;
}

 最後にオプションメニューが選択された際に、登録画面へ遷移する処理を記述します。オプションメニュー選択時の処理はonOptionsItemSelected()をオーバーライドして行います。

/**
 * オプションメニューの選択
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int itemId = item.getItemId();
    switch (itemId) {
    case R.id.menu_new:
        // 編集画面へ遷移
        Intent registIntent = new Intent( this, RegistActivity.class);
        startActivity( registIntent);
        break;
    }
    return true;
};

 これで一覧画面へのデータの表示および一覧画面からの画面遷移ができるようになりました。続いて参照画面を実装します。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:速習! Androidアプリケーション開発

著者プロフィール

  • 横井 朗(ヨコイ アキラ)

    株式会社ビーブレイクシステムズにて業務システムのパッケージソフト(MA-EYES)の製品開発から導入までを手掛けるとともに、オープンソースソフトウェア(ExCella)の開発リーダも務める。 オープンソース関連について多くの執筆経験を持つ。 &nbsp; &nbsp;

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5