Skip to content

Instantly share code, notes, and snippets.

@STAR-ZERO
Created December 18, 2012 08:39
Show Gist options
  • Save STAR-ZERO/4326172 to your computer and use it in GitHub Desktop.
Save STAR-ZERO/4326172 to your computer and use it in GitHub Desktop.
【Android】AsyncTaskLoaderのサンプル
public class SampleFragment extends Fragment implements LoaderCallbacks<String> {
private static final int LOADER_ID = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Loaderに渡す引数
Bundle args = new Bundle();
args.putString("hoge", "hoge");
// Loader初期化と開始
getLoaderManager().initLoader(LOADER_ID, args, this);
/**
* ★Loaderの操作メソッド
* ○getLoaderManager().getLoader(LOADER_ID).startLoading()
* Loaderの処理を開始
* getLoaderManager().initLoaderが呼ばれた時と同様の処理
*
* ○getLoaderManager().getLoader(LOADER_ID).stopLoading()
* Loaderの処理を停止
*/
}
@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
// 非同期処理を行うLoaderを生成する
// getLoaderManager().initLoaderで一回のみ呼び出される
String data = args.getString("hoge");
return new SampleLoader(getActivity(), data);
}
@Override
public void onLoadFinished(Loader<String> loader, String data) {
// 非同期処理完了
// ここでView等にデータをセット
}
@Override
public void onLoaderReset(Loader<String> loader) {
// Loaderが破棄される時に呼ばれる
// Loaderが参照しているデータを削除する
}
}
public class SampleLoader extends AsyncTaskLoader<String> {
/** 引数 */
private String mArg;
/** 非同期処理での結果 */
private String mData;
public SampleLoader(Context context, String arg) {
super(context);
mArg = arg;
}
@Override
public String loadInBackground() {
// 実際の非同期処理
try {
// 適当に時間がかかる処理
Thread.sleep(3000);
mData = "hoge";
} catch (InterruptedException e) {
e.printStackTrace();
}
return mData;
}
@Override
protected void onStartLoading() {
// 非同期処理開始前
// ActivityまたはFragment復帰時(バックキーで戻った、ホーム画面から戻った等)に
// 再実行されるためここで非同期処理を行うかチェック
if (mData != null) {
// 結果がnullではないは場合は既に実行済みとして非同期処理は不要
// deliverResultで結果を送信
deliverResult(mData);
}
if (takeContentChanged() || mData == null) {
// takeContentChanged いまいちよく分からない
// CursorLoaderの時に意味があるのかも…
// 非同期処理を開始
forceLoad();
}
}
@Override
protected void onStopLoading() {
// Loader停止時の処理
// 非同期処理のキャンセル
cancelLoad();
}
@Override
public void deliverResult(String data) {
// 登録してあるリスナー(LoaderCallbacksを実装したクラス)に結果を送信する
if (isReset()) {
// Loaderがリセット状態かどうか
// trueの場合はLoaderがまだ一度も開始していない、resetメソッドが呼ばれている
return;
}
mData = data;
super.deliverResult(data);
}
@Override
protected void onReset() {
// reset呼び出し時、Loader破棄時の処理
super.onReset();
// Loaderを停止
onStopLoading();
// データをクリア
mData = null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment