2013-12-12 10 views
7

ローダーを使用してデータベースから(多くの)データをロードするフラグメントが与えられています。Android Fragment - Fragmentの代わりにアクティビティのloadermanagerを使用します。大丈夫ですか?

問題:

私は、ユーザーがそれを保持しているタブから離れると、ユーザーが戻ってそのタブになったときに、それを再作成するときの断片を破壊するページャアダプタを持っています。このレクリエーションにより、毎回新しいローダが作成され、毎回データがロードされます。

質問:

フラグメントが作成されるたびローダーを再作成回避するためには、フラグメントのonActivityCreated方法でgetActivity.getSupportLoaderManager.initLoader(loaderId, null, false)を使用しても大丈夫でしょうか?

私はそれを試して、それをテストし、それは正常に動作しているようです。しかし、私はそれが正しいと確信していない。

+0

この方法では問題はありません。フラグメントごとに一意のIDを使用していることを確認してください(同じローダーを再利用しない限り) –

+0

IDが一意であることを確認しました。それは正しいとは思わない。ローダーが作成されると、フラグメントがコールバックとして登録され、システムがフラグメントを破壊した場合、ローダーはデータを再ロードし、 'onLoadFinished()'メソッドを呼び出そうとしますか? – 500865

+0

'onLoadFinished'がアクティビティで呼び出され、これはフラグメントを検索する必要があります。そこに存在する可能性もあります(この場合は、結果を無視します)。とにかく、私は今、適切な答えを残しました。 –

答えて

2

実際には、ソースコードをチェックすると、同じ結果になります。

Fragment.getLoaderManager:

/** 
* Return the LoaderManager for this fragment, creating it if needed. 
*/ 
public LoaderManager getLoaderManager() { 
    if (mLoaderManager != null) { 
     return mLoaderManager; 
    } 
    if (mActivity == null) { 
     throw new IllegalStateException("Fragment " + this + " not attached to Activity"); 
    } 


    mCheckedForLoaderManager = true; 
    mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, true); 
    return mLoaderManager; 
} 

mWhoは、基本的には、フラグメントIDです。 Activity.getLoaderManager()

final void setIndex(int index, Fragment parent) { 
    mIndex = index; 
    if (parent != null) { 
     mWho = parent.mWho + ":" + mIndex; 
    } else { 
     mWho = "android:fragment:" + mIndex; 
    } 
} 

違いは

  • Activity source codeより良い方法かもしれません誰があなたが断片から直接呼び出して、あなたが求めているものを行うことができていてもそう(root)

    になるということです

  • Fragment source code

免責事項:あなたは、単に断片を保持していない理由を私は聞いても私は、最新バージョンのソースコードをチェックし、私はそれが

0

非常に異なることを期待していませんか?必要なのは、フラグメントにローダーを作成し、setRetainInstance(true)を使用してフラグメントを作成することです。 この場合、フラグメントを追加するときにTAGを指定してください。 この方法では、フラグメントはアクティビティの設定変更に対しても生き残り、ビューのみが再作成され、ローダーは生き残ります。

関連する問題