2012年11月3日土曜日

AsyncTaskLoaderを利用する

はじめにAsyncTaskLoaderを利用する場合の重要なメソッドを以下に纏めます。
以下に挙げたメソッドはどれも必ず実装しなければならないものです。

LoaderCallbacksインターフェース

Loaderを呼び出すActivityやFragmentにimplementsするインターフェースです。
メソッド名 概要
onCreateLoader loaderが新しく作成されたときに呼び出される。
onLoadFinished loader内の処理が終了したときに呼び出される。
onLoaderReset loaderがリセットされた時に呼び出される。

AsyncTaskLoaderクラスのメソッド

AsyncTaskLoaderクラスのメソッドとして、必ずOverrideし作成しなければならないメソッドは以下の一つです。
メソッド 概要
loadInBackground バックグラウンドで実行する処理を書く

AsyncTaskLoaderを継承したクラスを用意する

早速、AsyncTaskLoaderを継承したクラスを用意しましょう。
AsyncTaskLoaderは抽象クラスのため、継承して利用します。
AsyncTaskLoaderを継承したクラスの作成方法の具体例は、以下サンプルをご覧下さい。
■ApplicationListLoader.java
1
2
3
4
5
6
7
8
9
public class ApplicationListLoader extends AsyncTaskLoader<List<ApplicationListItem>> {
    //省略.....
    @Override
    public List<ApplicationListItem> loadInBackground() {
    //省略.....
    }
作成するAsyncTaskLoaderを継承したクラスでは、バックグラウンドでの処理実行結果を返す型を指定する必要があります。
上記サンプルソースコードの
1行目6行目
に注目してください。
サンプルソースコードでは
List型がバックグラウンドでの実行結果の戻りになっていることがわかります。

バックグラウンド処理を記述する

作成したAsyncTaskLoaderを継承したクラスのloadInBackgroundメソッド内にバックグラウンドで実行する処理を記述します。
loadInBackgroundメソッドの実行後、Activity/Fragmentに実装するonLoadFinishedメソッドが呼び出されます。
onLoadFinishedメソッドでAsyncTaskLoaderの実行結果を利用する場合には、loadInBackgroundメソッドのreturnに指定しましょう。
onLoadFinishedメソッドの第二引き数として取得することができます。
本サンプルでは、バックグラウンドで端末にインストールされたアプリケーション一覧を取得しています。
loadInBackgroundメソッドの処理は以下の通りです。
前述の通り、アプリケーションの一覧をPackageManagerから取得し、
Listアイテムの管理用に作成したApplicationListItemクラスに挿入しています。
■ApplicationListLoader.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
public List<ApplicationListItem> loadInBackground() {
    // Application一覧の取得
    List<ApplicationInfo> appInfoList = pm.getInstalledApplications(Context.BIND_AUTO_CREATE);
     
    // Application一覧の読み込み
    List<ApplicationListItem> ret = new ArrayList<ApplicationListItem>(appInfoList.size());
    for(ApplicationInfo info : appInfoList){
        ApplicationListItem item = new ApplicationListItem(info);
        try {
            // nameの追加
            item.setName(info.loadLabel(pm).toString());
             
            // Iconの追加
            item.setIcon(pm.getApplicationIcon(info.packageName));
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        ret.add(item);
    }
    return ret;
}
2行目でloadInBackgroundメソッドの戻り値を指定しています。
ここで、onLoadFinishedメソッドで利用する型を宣言しておきましょう。
本サンプルでは、インストールされたアプリケーションをリスト表示するためのList型をreturnしています。

Loaderを呼び出す

Activity、またはFragmentからLoaderを呼び出す事ができます。
Loaderを呼び出すActivity/Fragmentには、
LoaderCallbacksインターフェースimplements
する必要があります。
実装しなければならないメソッドは冒頭の表でも触れた通り、
onCreateLoaderメソッドonLoadFinishedメソッドonLoaderResetメソッドの3つです。
サンプルでの3つのメソッドの実装は以下の通りになっています。
■LoaderSampleActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class LoaderSampleActivity extends Activity implements LoaderCallbacks<List<ApplicationListItem>>{
    ApplicationListAdapter mAdapter;
    // 省略...(下記にて別途引用)
    // onCreateメソッド
    /**
     * Loaderの開始処理
     */
    @Override
    public Loader<List<ApplicationListItem>> onCreateLoader(int id, Bundle args) {
        ApplicationListLoader appLoader = new ApplicationListLoader(getApplication());
         
        // loaderの開始
        appLoader.forceLoad();
        return appLoader;
    }
    /**
     * Loaderの処理終了コールバック
     */
    @Override
    public void onLoadFinished(Loader<List<ApplicationListItem>> arg0,
            List<ApplicationListItem> arg1) {
        // リスト表示するAdapterにアイテムをセット
        for(ApplicationListItem item : arg1){
            mAdapter.add(item);
        }
        // リスト表示の更新
        mAdapter.notifyDataSetChanged();
    }
    /**
     * Loaderがリセットされた時によびだされる
     */
    @Override
    public void onLoaderReset(Loader<List<ApplicationListItem>> arg0) {
          // 今回は無視する
    }
11行目、23行目、38行目でそれぞれLoaderCallbacksインターフェースのメソッドをOverrideしています。
15行目でLoaderクラスの
forceLoadメソッド
を呼び出し、Loaderの処理を開始させています。
forceLoadメソッドの呼び出しは
プロセスのメインスレッドで行う必要があります。
また、Callbackメソッドを用意する以外にLoaderの初期化処理を行う必要があります。
初期化処理は
LoaderManagerクラスのinitLoaderメソッドを利用して行います。
Loaderの初期化処理のサンプルは以下の通りです。
■LoaderSampleActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
@Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     ListView list = (ListView)findViewById(R.id.listView1);
     mAdapter = new ApplicationListAdapter(this, android.R.layout.simple_list_item_1);
     list.setAdapter(mAdapter);
     // loaderの初期化
     getLoaderManager().initLoader(0, null, this);
 }
11行目でLoaderの初期化処理を行っています。
ActivityクラスのgetLoaderManagerメソッドでLoaderManagerクラスのインスタンスを取得し、initLoaderメソッドを呼び出しています。
initLoaderクラスのメソッドの引数は、次のとおりになります。
引数 詳細
第一引数( int ) onCreateLoaderメソッドの第一引数に渡されます。
第二引数( Bundle ) onCreateLoaderメソッドの第二引数に渡されます。
第三引数 ( LoaderCallback ) LoaderCallbackインターフェースを継承したクラスを指定します。

0 件のコメント:

コメントを投稿