AsyncTaskLoader の使い方 (6/8) 〜 いろいろな Loader の使用例

AsyncTaskLoader___Android_Developers

AsyncTaskLoader | Android Developers


目次

1. Thread と AsyncTask
2. AsyncTaskLoader の利点
3. LoaderManager の利用
4. よくある間違いと回避法
5. 基本的な Loader の実装
6. いろいろな Loader の使用例
7. データベースと CursorLoader
8. Loader の弱点を克服する


6. いろいろな Loader の使用例

代わりにグローバルなキャッシュ利用する

public abstract class GlobalCacheLoader<T> extends AsyncTaskLoader<T> { 
    ... 
    @Override 
    protected void onStartLoading() { 
        T cachedResult = getCachedResult(); 
        if (cachedResult != null) { 
            // 結果が利用可能であればすぐに配送
            deliverResult(cachedResult); 
        }
        if (takeContentChanged() || cachedResult == null) { 
            // 最終読み込み時のデータが変更されているか、
            // または、利用不可(null)の場合
            forceLoad(); 
        } 
    } 
    ... 
    protected abstract T getCachedResult(); 
}

データ監視部分

* onContentChanged() 
    Loader が開始されていたら forceLoad()、停止していたら フラグをセット。 
* takeContentChanged() 
    フラグの値を返して、クリアする。 
@Override 
protected void onStartLoading() { 
    if (mResult != null) { 
        deliverResult(mResult); 
    }
    if (takeContentChanged() || mResult == null) { 
        forceLoad(); 
    } 
}

 

AutoRefreshLoader

public abstract class AutoRefreshLoader<T> extends LocalCacheLoader<T> { 

    private long interval; 
    private Handler handler; 
    private final Runnable timeoutRunnable = new Runnable() { 

        @Override 
        public void run() { 
            onContentChanged(); 
        } 
        
    }; 

    public AutoRefreshLoader(Context context, long interval) { 
        super(context); 
        this.interval = interval; 
        this.handler = new Handler(); 
    } 

    @Override 
    protected void onForceLoad() { 
        super.onForceLoad(); 
        handler.removeCallbacks(timeoutRunnable); 
        handler.postDelayed(timeoutRunnable, interval); 
    }

    @Override 
    public void onCanceled(T data) { 
        super.onCanceled(data); 
        // Retry a refresh the next time the loader is started 
        onContentChanged(); 
    }

    @Override 
    protected void onReset() { 
        super.onReset(); 
        handler.removeCallbacks(timeoutRunnable); 
    } 
    
}

(→「7. データベースと CursorLoader」へつづく)


関連ワード:  Android初心者開発