AsyncTaskLoader | Android Developers
目次
1. Thread と AsyncTask
2. AsyncTaskLoader の利点
3. LoaderManager の利用
4. よくある間違いと回避法
5. 基本的な Loader の実装
6. いろいろな Loader の使用例
7. データベースと CursorLoader
8. Loader の弱点を克服する
8. Loader の弱点を克服する
1. 進捗状況(progress)の更新ができない。
対応策:
LocalBroadcastManager を使う。
Activity 側。
@Override protected void onStart() { // Receive loading status broadcasts in order to update the progress bar LocalBroadcastManager.getInstance(this) .registerReceiver(loadingStatusReceiver, new IntentFilter(MyLoader.LOADING_ACTION)); super.onStart(); } @Override protected void onStop() { super.onStop(); LocalBroadcastManager.getInstance(this).unregisterReceiver(loadingStatusReceiver); }
Loader 側。
@Override public Result loadInBackground() { // Show progress bar Intent intent = new Intent(LOADING_ACTION).putExtra(LOADING_EXTRA, true); LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); try { return doStuff(); } finally { // Hide progress bar intent = new Intent(LOADING_ACTION).putExtra(LOADING_EXTRA, false); LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); } }
2. LoaderCallbacks 内でエラーのハンドリングができない。
デフォルトでエラー時には null を返す。
回避策:
1)Pair
のような複合オブジェクトに例外と一緒に結果をカプセル化します。
警告:Loader のキャッシュの情報に追加されることになるので、オブジェクトが null であるか、エラーが含まれているかどうかを確認しなければなりません。
2)catched例外を露出させるために、Loader にプロパティを追加します。
public abstract class ExceptionSupportLoader<T> extends LocalCacheLoader<T> { private Exception lastException; public ExceptionSupportLoader(Context context) { super(context); } public Exception getLastException() { return lastException; } @Override public T loadInBackground() { try { return tryLoadInBackground(); } catch (Exception e) { this.lastException = e; return null; } } protected abstract T tryLoadInBackground() throws Exception; }
@Override public void onLoadFinished(Loader<Result> loader, Result result) { if (result == null) { Exception exception = ((ExceptionSupportLoader<Result>) loader).getLastException(); // Error handling } else { // Result handling } }
(おしまい)
関連ワード: Android・初心者・開発・AsyncTaskLoader・CursorLoader・LoaderManager