/* * Copyright (C) 2016 Google Inc. * Licensed to The Android Open Source Project. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.utils; import android.content.AsyncTaskLoader; import android.content.Context; /** * This class fills in some boilerplate for AsyncTaskLoader to actually load things. * * Subclasses need to implement {@link AsyncLoader#loadInBackground()} to perform the actual * background task, and {@link AsyncLoader#onDiscardResult(T)} to clean up previously loaded * results. * * This loader is based on the MailAsyncTaskLoader from the AOSP EmailUnified repo. */ public abstract class AsyncLoader<T> extends AsyncTaskLoader<T> { private T mResult; public AsyncLoader(final Context context) { super(context); } @Override protected void onStartLoading() { if (mResult != null) { deliverResult(mResult); } if (takeContentChanged() || mResult == null) { forceLoad(); } } @Override protected void onStopLoading() { cancelLoad(); } @Override public void deliverResult(final T data) { if (isReset()) { if (data != null) { onDiscardResult(data); } return; } final T oldResult = mResult; mResult = data; if (isStarted()) { super.deliverResult(data); } if (oldResult != null && oldResult != mResult) { onDiscardResult(oldResult); } } @Override protected void onReset() { super.onReset(); onStopLoading(); if (mResult != null) { onDiscardResult(mResult); } mResult = null; } @Override public void onCanceled(final T data) { super.onCanceled(data); if (data != null) { onDiscardResult(data); } } /** * Called when discarding the load results so subclasses can take care of clean-up or * recycling tasks. This is not called if the same result (by way of pointer equality) is * returned again by a subsequent call to loadInBackground, or if result is null. * * Note that this may be called concurrently with loadInBackground(), and in some circumstances * may be called more than once for a given object. * * @param result The value returned from {@link AsyncLoader#loadInBackground()} which * is to be discarded. */ protected abstract void onDiscardResult(final T result); }