AsyncTaskLoader の使い方 (8/8) 〜 Loader の弱点を克服する

AsyncTaskLoader___Android_Developers

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初心者開発