
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
}
}
(おしまい)
Related Categories : Android・Developmemt・Newbie・AsyncTaskLoader・CursorLoader・LoaderManager