0

로더가 있습니다. 기본 데이터 모델이 변경 될 때만 시작하고 싶습니다. 나는 로더의 요점으로 이해했다. 안드로이드 문서에서 :활동 시작시 로더가 다시 시작됩니다.

로더는, 특히 CursorLoader에서 정지 후 데이터 를 유지할 것으로 예상된다

. 이를 통해 응용 프로그램은 데이터를 작업 또는 조각의 onStop() 및 onStart() 메서드에 유지할 수 있으므로 사용자가 응용 프로그램으로 돌아올 때 데이터를 다시로드 할 때까지 기다릴 필요가 없습니다.

우수. 그러나 내 활동이 재개 될 때마다 내 loader onStartLoading()이 호출됩니다. 플랫폼 코드로 디버깅하면 Activity.onStart()를 구현하면 모든 로더가 다시 시작됩니다. 특히 호출 스택은 내가 내 활동이 다시 시작될 때 다시로드하지 않도록

Activity.onStart() --> 
FragmentController..doLoaderStart() --> 
FragmentHostCallback.doLoaderStart() --> 
LoaderManagerImpl.doStart() --> 
LoadermanagerImpl.LoaderInfo.start() --> 
Loader.startLoader() --> 
<my loader>.onStartLoading() 

내 로더는 비용이 많이 드는이며, 이것은 특별히 로더가 유지 해야하는 것을 주장하는 위의 인용에 갈 것 같다 그들의 데이터는 정지/시작 사이클을 가로 지른다.

의미가 있습니까?

+0

그냥 팁. 로더보다는 라이프 사이클 구성 요소를 사용하여 실제로 조사해야합니다. 다음은 Loader, Lifecycle 및 state : https : // medium에 대한 자세한 설명입니다.co.kr/google-developers/viewmodels-persistence-onsaveinstancestate-restore-ui-state-and-loaders-fc7cc4a6c090 – Peter

+0

'getLoaderManager.initLoader()'를 (를) 호출하는 위치를 공유 할 수 있습니까? – chessdork

+0

로더에서 아키텍처 구성 요소로의 변환에 관한 블로그 게시물 (https://medium.com/google-developers/lifecycle-aware-data-loading-with-android-architecture-components-f95484159de4) – ianhanniballake

답변

1

답장을 보내십시오.

문제는 기본적으로 로더에 대한 오해였습니다. 프레임 워크가 LoaderonStartLoading()을 호출하면 라이프 사이클 메소드와 비슷합니다. 로더에게 활동이 시작되었음을 알리는 프레임 워크입니다. 원래의 생각과 달리 로더가 데이터를 다시로드해야한다는 의미는 아닙니다.

로더를 순진하게 구현하면 (예 : 내 것) 모든 데이터가 onStartLoading()에 다시로드됩니다. 똑똑한 구현은 기본 데이터가 변경된 경우에만로드됩니다. 우리가 CursorLoader.onStartLoading()에서

@Override 
protected void onStartLoading() { 
    if (mCursor != null) { 
     deliverResult(mCursor); 
    } 
    if (takeContentChanged() || mCursor == null) { 
     forceLoad(); 
    } 
} 

을 보면 먼저 그것을 가지고 즉시 캐시 된 결과를 보냅니다. 그런 다음 실제로 데이터를로드하는 forceLoad()을 호출합니다 (). 데이터가 변경된 경우에만이 수행됩니다.

다른 세부 사항은 콘텐츠가 변경되면 어떻게 추적되는지입니다. 그것은 onContentChanged()Loader의 구현으로 귀결 :

public void onContentChanged() { 
    if (mStarted) { 
     forceLoad(); 
    } else { 
     // This loader has been stopped, so we don't want to load 
     // new data right now... but keep track of it changing to 
     // refresh later if we start again. 
     mContentChanged = true; 
    } 
} 

이 방법은 말한다 : 우리가 시작하고 같은 내용이 변경되면, 데이터를로드합니다. 그렇지 않으면 콘텐츠가 변경되었음을 알려주는 깃발을 보관하십시오. 이것은 기본적으로 로더가 시작될 때까지 데이터의 실제로드를 지연시킵니다.

public boolean takeContentChanged() { 
    boolean res = mContentChanged; 
    mContentChanged = false; 
    mProcessingChange |= res; 
    return res; 
} 

만큼 내용이 변경되었을 때 로더 구현 onContentChanged()를 호출로, Loader의 구현이 나머지를 처리합니다

takeContentChanged()은 기본적으로 mContentChanged 인스턴스 필드를 확인합니다.