Loader

※Android 3.0 (API level 11) 以降で使用できます。≫Support Library

Loaderのクラス階層

Loader | Android Developers

LoaderのID

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クラス

AsyncTaskLoaderクラスは、AsyncTaskクラスを提供するLoaderのサブクラスです。これはジェネリック クラスですので、定義時に型を指定します。

  • java.lang.Object
    • android.content.Loader<D>
      • android.content.AsyncTaskLoader<D>

loadInBackground()メソッド

AsyncTaskLoaderクラス、唯一の抽象メソッドです。このメソッドはワーカースレッドで呼ばれますので、読み込みを行い、その結果を返す処理をさせます。

public abstract D loadInBackground ()
loadInBackground - AsyncTaskLoader | Android Developers

LoaderManagerクラス

LoaderManagerのインスタンスは、ActivityクラスのgetLoaderManager()で取得できます。

public LoaderManager getLoaderManager ()
getLoaderManager - Activity | Android Developers

initLoader()

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に、読み込まれたデータが格納されている
    }
}

LoaderCallbacksインターフェイス

LoaderManagerによって管理されるLoaderの、状態変化時の処理を実装します。実装すべきメソッドは次の3つです。

onCreateLoader()

onCreateLoader()は、LoaderManager.initLoader()の実行時に呼ばれます。このメソッドでLoaderを生成し、初期化して返します。

public abstract Loader<D> onCreateLoader (int id, Bundle args)

onLoadFinished()

onLoadFinished()は、作成されているLoaderの読み込みが完了したときに呼ばれます。

public abstract void onLoadFinished (Loader<D> loader, D data)

読み込まれたデータが、dataで渡されます。

onLoaderReset()

Loaderがリセットされたときに呼ばれます。

public abstract void onLoaderReset (Loader<D> loader)
Androidの情報サイトから、まとめて検索