Android AsyncTaskLoader avec cache


Exemple

Il est recommandé de mettre en cache les résultats chargés pour éviter le chargement multiple des mêmes données.
Pour invalider le cache onContentChanged() doit être appelé. Si loader a déjà été démarré, forceLoad() sera appelé, sinon (si loader à l'état arrêté), loader pourra comprendre le changement de contenu avec la takeContentChanged() de takeContentChanged() .

Remarque: onContentChanged() doit être appelé à partir du thread principal du processus.

Javadocs dit à propos de takeContentChanged ():

Prenez l'indicateur actuel indiquant si le contenu du chargeur a été modifié pendant son arrêt. Si c'était le cas, true est renvoyé et le drapeau est effacé.

public abstract class BaseLoader<T> extends AsyncTaskLoader<T> {

    // Cached result saved here
    private final AtomicReference<T> cache = new AtomicReference<>();

    public BaseLoader(@NonNull final Context context) {
        super(context);
    }

    @Override
    public final void deliverResult(final T data) {
        if (!isReset()) {
            // Save loaded result
            cache.set(data);
            if (isStarted()) {
                super.deliverResult(data);
            }
        }
    }

    @Override
    protected final void onStartLoading() {            
        // Register observers
        registerObserver();

        final T cached = cache.get();    
        // Start new loading if content changed in background
        // or if we never loaded any data
        if (takeContentChanged() || cached == null) {
            forceLoad();
        } else {
            deliverResult(cached);
        }
    }

    @Override
    public final void onStopLoading() {
        cancelLoad();
    }

    @Override
    protected final void onReset() {
        super.onReset();
        onStopLoading();
        // Clear cache and remove observers
        cache.set(null);
        unregisterObserver();
    }

    /* virtual */
    protected void registerObserver() {
        // Register observers here, call onContentChanged() to invalidate cache
    }

    /* virtual */
    protected void unregisterObserver() {
        // Remove observers
    }
}