2013-12-12 3 views
7

로더를 사용하여 데이터베이스에서 많은 양의 데이터를로드하는 단편이 제공됩니다.Android Fragment - Fragment 's 대신 액티비티의 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이다.

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

Activity.getLoaderManager()의 차이는 사람이 당신이 요구하는 무엇을 할 수 그래서 비록 (root)

될 것이다 조각에서 직접 호출하는 것이 더 나은 방법

면책 조항 : 나는 최신 버전의 소스 코드를 확인,하지만 난 그게

0

내가 왜 단순히 조각을 유지하지 않습니다 물어 봐도 매우 다른 것으로 기대하지 않는다? 필요한 것은 조각에 Loader를 만들고 setRetainInstance (true)를 사용하여 조각을 만드는 것입니다. 이 경우 조각을 추가 할 때 태그를 제공해야합니다. 이렇게하면 조각이 작업 구성 변경에 대해서도 살아남을 수 있으며 로더를 그대로두고 뷰가 다시 생성됩니다.