package com.github.andlyticsproject.util;
import android.support.v4.content.AsyncTaskLoader;
import android.content.Context;
import android.util.Log;
public abstract class LoaderBase<T> extends AsyncTaskLoader<LoaderResult<T>> {
private static final String TAG = LoaderBase.class.getSimpleName();
protected LoaderResult<T> lastResult;
protected LoaderBase(Context context) {
super(context);
}
@Override
public void deliverResult(LoaderResult<T> result) {
if (isReset()) {
if (result != null) {
releaseResult(result);
}
return;
}
LoaderResult<T> oldResult = lastResult;
lastResult = result;
if (isStarted()) {
super.deliverResult(result);
}
if (oldResult != null && oldResult != result && isActive(result)) {
releaseResult(oldResult);
}
}
@Override
protected void onStartLoading() {
if (lastResult != null) {
deliverResult(lastResult);
}
if (takeContentChanged() || lastResult == null) {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
@Override
public void onCanceled(LoaderResult<T> result) {
super.onCanceled(result);
if (result != null && isActive(result)) {
releaseResult(result);
}
}
@Override
protected void onReset() {
super.onReset();
onStopLoading();
if (lastResult != null && isActive(lastResult)) {
releaseResult(lastResult);
}
lastResult = null;
}
@Override
public LoaderResult<T> loadInBackground() {
try {
return LoaderResult.create(load());
} catch (Exception e) {
Log.e(TAG, "Error loading data: " + e.getMessage(), e);
return LoaderResult.createFailed(e);
}
}
protected abstract T load() throws Exception;
protected abstract void releaseResult(LoaderResult<T> result);
protected abstract boolean isActive(LoaderResult<T> result);
}