ひらい ぶらり Hi-Library

ぷろぐらみんぐについて。ときどきどうでもいいことについて。

FragmentTabHost内部のFragmentでAsyncTaskLoaderを使ってたらargsが変わらない

結論:タイトルが長い

結論:onStopでgetLoaderManager().destoryLoader(id)してあげる

こんにちはこんにちは

世間では何かとAsyncTaskじゃなくてAsyncTaskLoader使おうぜっていう風潮ですね。 僕もブームに乗ってAsyncTaskからAsyncTaskLoaderに乗り換えてみました。 タイトルに有るとおり、FragmentTabHost内部のFragmentで使用しています。 タブが切り替わるたびに、毎回Loaderで通信して、最新のデータを取得しようと思ってました。 そんなわけで

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        String url = URL + "?id=" + id;
        Bundle bundle = new Bundle();
        bundle.putString("url", url);
        getLoaderManager().initLoader(LOADER_IDI, null, this);
    }

のようにしてました。タブが切り替わればonActivityCreatedが呼ばれるので、毎回呼ばれる、毎回通信して最新情報、ヤッピーって思ってた時期が僕にもありました。 LoaderはFragmentのインスタンス毎に割り振られるので、タブを切り替えてもFragmentのインスタンスは死んでないらしく、既に取得済みのデータが返ってきました。そうじゃないんだ。もう一回通信して欲しいのだ。 そんなわけで、tabが切り替わるときにはFragmentのonStopが呼ばれるので、そこで一度Loaderを破棄して、またLoaderを初期化させることで事なきを得た。めでたしめでたし。

    @Override
    public void onStop()
    {
        super.onStop();
        getLoaderManager().destroyLoader(LOADER_ID);
    }