AsyncTaskLoader#loadInBackgroundだけを変更すればあとはコピペで使えそう
Created
December 18, 2012 08:39
-
-
Save STAR-ZERO/4326172 to your computer and use it in GitHub Desktop.
【Android】AsyncTaskLoaderのサンプル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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が参照しているデータを削除する | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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