※Android 3.0 (API level 11) 以降で使用できます。≫Support Library
LoaderManager.initLoader()で指定したLoaderのIDは、getId()で取得できます。
public int getId ()getId - Loader | Android Developers
バックグラウンドで処理するクラスを、AsyncTaskLoaderを継承して定義します。
class HttpAsyncTaskLoader extends AsyncTaskLoader<String> { private String url = null; public HttpAsyncTaskLoader(Context context, String url) { super(context); this.url = url; } @Override public String loadInBackground() { ResponseHandler<String> responseHandler = new ResponseHandler<String>() { @Override public String handleResponse(HttpResponse response) throws IOException { String entity = null; if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { entity = EntityUtils.toString(response.getEntity(), "UTF-8"); } return entity; } }; HttpClient httpClient = new DefaultHttpClient(); String responseBody = null; try { HttpGet httpGet = new HttpGet(this.url); responseBody = httpClient.execute(httpGet, responseHandler); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { httpClient.getConnectionManager().shutdown(); } return responseBody; } }
Loaderの状態変化時に実行する処理を、LoaderCallbacksを実装して定義します。
class LoaderStates implements LoaderManager.LoaderCallbacks<String> { private Context context; public LoaderStates(Context context) { this.context = context; } @Override public Loader<String> onCreateLoader(int id, Bundle args) { String url = args.getString("url"); HttpAsyncTaskLoader loader = new HttpAsyncTaskLoader(this.context, url); // 非同期読み込みを実行する loader.forceLoad(); return loader; } @Override public void onLoadFinished(Loader<String> loader, String data) { if (data != null) { System.out.println(data); // (引数dataに、読み込まれたデータが格納されている) } } @Override public void onLoaderReset(Loader<String> loader) { System.out.println("onLoaderReset"); } }
このクラスは次のように利用します。http://example.comからの読み込みを指示し、結果は標準出力へ出力されます。
Bundle bundle = new Bundle(); bundle.putString("url", "http://example.com"); LoaderStates loaderStates = new LoaderStates(this); LoaderManager loaderManager = getLoaderManager(); loaderManager.initLoader(0, bundle, loaderStates);Web APIの基本的な使い方 (2/3):CodeZine 高江賢 (2013/08/01)
AsyncTaskLoaderクラスは、AsyncTaskクラスを提供するLoaderのサブクラスです。これはジェネリック クラスですので、定義時に型を指定します。
AsyncTaskLoaderクラス、唯一の抽象メソッドです。このメソッドはワーカースレッドで呼ばれますので、読み込みを行い、その結果を返す処理をさせます。
public abstract D loadInBackground ()loadInBackground - AsyncTaskLoader | Android Developers
LoaderManagerのインスタンスは、ActivityクラスのgetLoaderManager()で取得できます。
public LoaderManager getLoaderManager ()getLoaderManager - Activity | Android Developers
LoaderManager.initLoader()でLoaderを初期化します。
public abstract Loader<D> initLoader ( int id, Bundle args, LoaderCallbacks<D> callback )initLoader - LoaderManager | Android Developers
idはLoaderのIDです。argsはLoaderのコンストラクタに渡されます。すでにLoaderが存在しているならば、この引数は無視されます。callbackは、Loaderの状態が変化したときに呼ばれます。
public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<String> { @Override protected void onCreate(Bundle savedInstanceState) { String url = "http://example.com"; Bundle bundle = new Bundle(); bundle.putString("url", url); // Loaderの初期化を要求する getLoaderManager().initLoader(0, bundle, this); } @Override public Loader<String> onCreateLoader(int id, Bundle args) { // このメソッドは、LoaderManager.initLoader()の実行によって呼ばれる // 引数argsから、Loaderの生成に必要なデータを得る String url = args.getString("url"); // Loaderを継承するクラスを生成し、 // それで読み込みを実行し、それを返す return loader; } @Override public void onLoadFinished(Loader<String> loader, String data) { // このメソッドは、Loaderの読み込みが完了したときに呼ばれる // 引数dataに、読み込まれたデータが格納されている } }
LoaderManagerによって管理されるLoaderの、状態変化時の処理を実装します。実装すべきメソッドは次の3つです。
onCreateLoader()は、LoaderManager.initLoader()の実行時に呼ばれます。このメソッドでLoaderを生成し、初期化して返します。
public abstract Loader<D> onCreateLoader (int id, Bundle args)
onLoadFinished()は、作成されているLoaderの読み込みが完了したときに呼ばれます。
public abstract void onLoadFinished (Loader<D> loader, D data)
読み込まれたデータが、dataで渡されます。
Loaderがリセットされたときに呼ばれます。
public abstract void onLoaderReset (Loader<D> loader)