AsyncTaskLoader.java revision 247fe74c934cb3fba85aae7e051a8044f460fb11
19911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton/* 29911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Copyright (C) 2010 The Android Open Source Project 39911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * 49911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 59911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * you may not use this file except in compliance with the License. 69911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * You may obtain a copy of the License at 79911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * 89911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 99911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * 109911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Unless required by applicable law or agreed to in writing, software 119911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 129911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * See the License for the specific language governing permissions and 149911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * limitations under the License. 159911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton */ 169911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 179911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamiltonpackage android.content; 189911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 199911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamiltonimport android.os.AsyncTask; 20247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackbornimport android.os.Handler; 21247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackbornimport android.os.SystemClock; 22cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikovimport android.util.Log; 23247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackbornimport android.util.TimeUtils; 24cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov 25247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackbornimport java.io.FileDescriptor; 26247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackbornimport java.io.PrintWriter; 27cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikovimport java.util.concurrent.ExecutionException; 289911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 299911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton/** 309911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Abstract Loader that provides an {@link AsyncTask} to do the work. 31bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov * 329911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * @param <D> the data type to be loaded. 339911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton */ 349911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamiltonpublic abstract class AsyncTaskLoader<D> extends Loader<D> { 35cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov 36cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov private static final String TAG = "AsyncTaskLoader"; 37cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov 38247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn final class LoadTask extends AsyncTask<Void, Void, D> implements Runnable { 39bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov 40247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn D result; 41247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn boolean waiting; 42bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov 439911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton /* Runs on a worker thread */ 449911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton @Override 459911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton protected D doInBackground(Void... params) { 46247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn result = AsyncTaskLoader.this.onLoadInBackground(); 47bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov return result; 489911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 499911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 509911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton /* Runs on the UI thread */ 519911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton @Override 529911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton protected void onPostExecute(D data) { 530e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn AsyncTaskLoader.this.dispatchOnLoadComplete(this, data); 549911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 55bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov 56bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov @Override 57bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov protected void onCancelled() { 58247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn AsyncTaskLoader.this.dispatchOnCancelled(this, result); 59247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 60247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 61247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn @Override 62247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn public void run() { 63247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn waiting = false; 64247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn AsyncTaskLoader.this.executePendingTask(); 65bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov } 669911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 679911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 68cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov volatile LoadTask mTask; 69247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn volatile LoadTask mCancellingTask; 70247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 71247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn long mUpdateThrottle; 72247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn long mLastLoadCompleteTime = -10000; 73247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn Handler mHandler; 749911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 759911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public AsyncTaskLoader(Context context) { 769911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton super(context); 779911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 789911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 79247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn /** 80247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * Set amount to throttle updates by. This is the minimum time from 81247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * when the last {@link #onLoadInBackground()} call has completed until 82247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * a new load is scheduled. 83247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * 84247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * @param delayMS Amount of delay, in milliseconds. 85247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn */ 86247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn public void setUpdateThrottle(long delayMS) { 87247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mUpdateThrottle = delayMS; 88247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (delayMS != 0) { 89247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mHandler = new Handler(); 90247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 91247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 92247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 939911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton @Override 94a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn protected void onForceLoad() { 950e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn super.onForceLoad(); 96bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov cancelLoad(); 979911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mTask = new LoadTask(); 98247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn executePendingTask(); 999911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1009911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 1019911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton /** 1029911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Attempt to cancel the current load task. See {@link AsyncTask#cancel(boolean)} 103247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * for more info. Must be called on the main thread of the process. 104247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * 105247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * <p>Cancelling is not an immediate operation, since the load is performed 106247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * in a background thread. If there is currently a load in progress, this 107247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * method requests that the load be cancelled, and notes this is the case; 108247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * once the background thread has completed its work its remaining state 109247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * will be cleared. If another load request comes in during this time, 110247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * it will be held until the cancelled load is complete. 1119911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * 112247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * @return Returns <tt>false</tt> if the task could not be cancelled, 1139911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * typically because it has already completed normally, or 114247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * because {@link #startLoading()} hasn't been called; returns 115247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * <tt>true</tt> otherwise. 1169911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton */ 1179911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public boolean cancelLoad() { 1189911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton if (mTask != null) { 119247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (mCancellingTask != null) { 120247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn // There was a pending task already waiting for a previous 121247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn // one being canceled; just drop it. 122247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (mTask.waiting) { 123247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mTask.waiting = false; 124247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mHandler.removeCallbacks(mTask); 125247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 126247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mTask = null; 127247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn return false; 128247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } else if (mTask.waiting) { 129247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn // There is a task, but it is waiting for the time it should 130247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn // execute. We can just toss it. 131247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mTask.waiting = false; 132247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mHandler.removeCallbacks(mTask); 133247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mTask = null; 134247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn return false; 135247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } else { 136247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn boolean cancelled = mTask.cancel(false); 137247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (cancelled) { 138247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mCancellingTask = mTask; 139247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 140247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mTask = null; 141247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn return cancelled; 142247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 1439911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1449911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton return false; 1459911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 146bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov 147bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov /** 148bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov * Called if the task was canceled before it was completed. Gives the class a chance 149bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov * to properly dispose of the result. 150bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov */ 151bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov public void onCancelled(D data) { 152bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov } 153bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov 154247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn void executePendingTask() { 155247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (mCancellingTask == null && mTask != null) { 156247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (mTask.waiting) { 157247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mTask.waiting = false; 158247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mHandler.removeCallbacks(mTask); 159247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 160247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (mUpdateThrottle > 0) { 161247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn long now = SystemClock.uptimeMillis(); 162247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (now < (mLastLoadCompleteTime+mUpdateThrottle)) { 163247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn // Not yet time to do another load. 164247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mTask.waiting = true; 165247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mHandler.postAtTime(mTask, mLastLoadCompleteTime+mUpdateThrottle); 166247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn return; 167247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 168247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 169247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mTask.execute((Void[]) null); 170247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 171247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 172247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 173247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn void dispatchOnCancelled(LoadTask task, D data) { 174247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn onCancelled(data); 175247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (mCancellingTask == task) { 176247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mLastLoadCompleteTime = SystemClock.uptimeMillis(); 177247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mCancellingTask = null; 178247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn executePendingTask(); 179247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 180247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 181247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 1820e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn void dispatchOnLoadComplete(LoadTask task, D data) { 1830e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn if (mTask != task) { 184247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn dispatchOnCancelled(task, data); 1850e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn } else { 186247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn mLastLoadCompleteTime = SystemClock.uptimeMillis(); 1870e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn mTask = null; 1880e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn deliverResult(data); 1890e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn } 1909911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1919911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 1929911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton /** 193247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn */ 194247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn public abstract D loadInBackground(); 195247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 196247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn /** 1979911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Called on a worker thread to perform the actual load. Implementations should not deliver the 198247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * result directly, but should return them from this method, which will eventually end up 199247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * calling {@link #deliverResult} on the UI thread. If implementations need to process 200247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * the results on the UI thread they may override {@link #deliverResult} and do so 201e6c6d09a7eb9a7cd6e94c164e75a08dc499fd577Jeff Hamilton * there. 2029911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * 203247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * @return Implementations must return the result of their load operation. 2049911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton */ 205247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn protected D onLoadInBackground() { 206247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn return loadInBackground(); 207247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 208cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov 209cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov /** 210cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov * Locks the current thread until the loader completes the current load 211cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov * operation. Returns immediately if there is no load operation running. 212cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov * Should not be called from the UI thread. 213cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov * <p> 214247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn * Use for testing only. <b>Never</b> call this from a UI thread. 215cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov */ 216cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov public void waitForLoader() { 217cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov LoadTask task = mTask; 218cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov if (task != null) { 219cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov try { 220cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov task.get(); 221cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov } catch (InterruptedException e) { 222cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov Log.w(TAG, e); 223cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov } catch (ExecutionException e) { 224cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov throw new RuntimeException("An error occured while executing waitForLoader()", 225cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov e.getCause()); 226cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov } 227cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov } 228cd3676e7b835653b04d4f66251a63749e7603f5bDmitri Plotnikov } 229247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 230247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn @Override 231247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 232247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn super.dump(prefix, fd, writer, args); 233247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (mTask != null) { 234247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn writer.print(prefix); writer.print("mTask="); writer.print(mTask); 235247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn writer.print(" waiting="); writer.println(mTask.waiting); 236247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 237247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (mCancellingTask != null) { 238247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn writer.print(prefix); writer.print("mCancellingTask="); writer.print(mCancellingTask); 239247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn writer.print(" waiting="); writer.println(mCancellingTask.waiting); 240247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 241247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn if (mUpdateThrottle != 0) { 242247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn writer.print(prefix); writer.print("mUpdateThrottle="); 243247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn TimeUtils.formatDuration(mUpdateThrottle, writer); 244247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn writer.print(" mLastLoadCompleteTime="); 245247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn TimeUtils.formatDuration(mLastLoadCompleteTime, 246247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn SystemClock.uptimeMillis(), writer); 247247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn writer.println(); 248247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 249247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 2509911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton} 251