はじめにAsyncTaskLoaderを利用する場合の重要なメソッドを以下に纏めます。
以下に挙げたメソッドはどれも必ず実装しなければならないものです。
以下に挙げたメソッドはどれも必ず実装しなければならないものです。
LoaderCallbacksインターフェース
Loaderを呼び出すActivityやFragmentにimplementsするインターフェースです。
メソッド名 | 概要 |
---|---|
onCreateLoader | loaderが新しく作成されたときに呼び出される。 |
onLoadFinished | loader内の処理が終了したときに呼び出される。 |
onLoaderReset | loaderがリセットされた時に呼び出される。 |
AsyncTaskLoaderクラスのメソッド
AsyncTaskLoaderクラスのメソッドとして、必ずOverrideし作成しなければならないメソッドは以下の一つです。
メソッド | 概要 |
---|---|
loadInBackground | バックグラウンドで実行する処理を書く |
AsyncTaskLoaderを継承したクラスを用意する
早速、AsyncTaskLoaderを継承したクラスを用意しましょう。
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 型がバックグラウンドでの実行結果の戻りになっていることがわかります。
上記サンプルソースコードの1行目、6行目に注目してください。
サンプルソースコードではList
バックグラウンド処理を記述する
作成したAsyncTaskLoaderを継承したクラスのloadInBackgroundメソッド内にバックグラウンドで実行する処理を記述します。
loadInBackgroundメソッドの実行後、Activity/Fragmentに実装するonLoadFinishedメソッドが呼び出されます。
onLoadFinishedメソッドでAsyncTaskLoaderの実行結果を利用する場合には、loadInBackgroundメソッドのreturnに指定しましょう。
onLoadFinishedメソッドの第二引き数として取得することができます。
loadInBackgroundメソッドの実行後、Activity/Fragmentに実装するonLoadFinishedメソッドが呼び出されます。
onLoadFinishedメソッドでAsyncTaskLoaderの実行結果を利用する場合には、loadInBackgroundメソッドのreturnに指定しましょう。
onLoadFinishedメソッドの第二引き数として取得することができます。
本サンプルでは、バックグラウンドで端末にインストールされたアプリケーション一覧を取得しています。
loadInBackgroundメソッドの処理は以下の通りです。
前述の通り、アプリケーションの一覧をPackageManagerから取得し、
Listアイテムの管理用に作成したApplicationListItemクラスに挿入しています。
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しています。
ここで、onLoadFinishedメソッドで利用する型を宣言しておきましょう。
本サンプルでは、インストールされたアプリケーションをリスト表示するためのList型をreturnしています。
Loaderを呼び出す
Activity、またはFragmentからLoaderを呼び出す事ができます。
Loaderを呼び出すActivity/Fragmentには、LoaderCallbacksインターフェースをimplementsする必要があります。
実装しなければならないメソッドは冒頭の表でも触れた通り、onCreateLoaderメソッド、onLoadFinishedメソッド、onLoaderResetメソッドの3つです。
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メソッドの呼び出しはプロセスのメインスレッドで行う必要があります。
15行目でLoaderクラスのforceLoadメソッドを呼び出し、Loaderの処理を開始させています。
forceLoadメソッドの呼び出しはプロセスのメインスレッドで行う必要があります。
また、Callbackメソッドを用意する以外にLoaderの初期化処理を行う必要があります。
初期化処理はLoaderManagerクラスのinitLoaderメソッドを利用して行います。
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クラスのメソッドの引数は、次のとおりになります。
ActivityクラスのgetLoaderManagerメソッドでLoaderManagerクラスのインスタンスを取得し、initLoaderメソッドを呼び出しています。
initLoaderクラスのメソッドの引数は、次のとおりになります。
引数 | 詳細 |
---|---|
第一引数( int ) | onCreateLoaderメソッドの第一引数に渡されます。 |
第二引数( Bundle ) | onCreateLoaderメソッドの第二引数に渡されます。 |
第三引数 ( LoaderCallback ) | LoaderCallbackインターフェースを継承したクラスを指定します。 |
0 件のコメント:
コメントを投稿