package jp.mixi.sample.loader; import android.content.Context; import android.support.v4.content.AsyncTaskLoader; import android.util.Log; public class MyAsyncTaskLoader extends AsyncTaskLoader<String> { public static final String TAG = MyAsyncTaskLoader.class.getSimpleName(); private String mCachedData; public MyAsyncTaskLoader(Context context) { super(context); } // 非同期処理の中身 @Override public String loadInBackground() { Log.v(TAG, "loadInBackground"); try { Thread.sleep(1000L); } catch (InterruptedException e) { Log.e(TAG, "interrupted!: ", e); } return "hogehoge"; } @Override public void deliverResult(String data) { Log.v(TAG, "deliverResult"); // ローダがリセットされ、そのローダのライフサイクルが終了となる場合 if (isReset()) { // キャッシュデータがある場合は、キャッシュを削除して、メモリから破棄可能にする if (mCachedData != null) { mCachedData = null; } return; } // 得られたデータをキャッシュする mCachedData = data; // ローダが開始されている場合、親にデータが得られたことを通知する if (isStarted()) { super.deliverResult(data); } } @Override protected void onStartLoading() { Log.v(TAG, "onStartLoading"); // キャッシュがある場合はそちらを返す if (mCachedData != null) { deliverResult(mCachedData); return; } // データソースに変更があったり、キャッシュデータがない場合は loadInBackground() に行くようにする if (takeContentChanged() || mCachedData == null) { forceLoad(); } } // ローダの非同期処理がストップする時のコールバック @Override protected void onStopLoading() { Log.v(TAG, "onStopLoading"); cancelLoad(); super.onStopLoading(); } // ローダがリセットされる時のコールバック @Override protected void onReset() { Log.v(TAG, "onReset"); onStopLoading(); super.onReset(); } }