0

나는 입니다. ListFragmentAsyncTaskLoader은 인터넷에서 데이터를 가져옵니다. ListFragmentBaseAdapter으로 채워집니다.LoaderManager가 로딩을 시작할 때 부분에 알립니다.

데이터가로드 될 때 BaseAdapter은 진행 진행 막대를 사용하여 첫 번째 행을 채 웁니다. 데이터가로드되고 오류가 발생하지 않으면 데이터는 ListView에 채워집니다. 그러나 어떤 오류가 발생하면 (AsyncTaskLoader에 오류가 있음을 나타내는이라는 플래그가 있음) BaseAdapter 오류 메시지와 함께 첫 번째 행을 채 웁니다.

문제 :로드 오류가있는 경우

, LoaderManager 자동으로 선한 (forceLoad()라는) 다시 데이터를로드하려고합니다. 하지만 내가 필요한 것은 BaseAdapter 데이터가로드 중임을 알려주는 것입니다. BaseAdapter 회전 진행률 표시 줄에 오류 메시지가 변경 될 수 있습니다.

LoaderManager이 (가) forceLoad()이라면 쉽게 알릴 수 있습니까?

나의 제안 :

ListFragment 아래의 인터페이스를 구현하고 AsyncTaskLoader의 생성자에서이 ListFragment를 전달합니다.

public interface LoadingListener { 
    public void onLoadingStatusChanged(boolean isLoading); 
} 

그럼 난 deliverResult(T data)loadInBackground()에서 onLoadingStatusChanged(true)onLoadingStatusChanged(false)를 호출 할 수 있습니다. AsyncTaskLoader의 Fragment에 대한 참조를 보유하면 해당 부분이 누출 될 수 있습니다.

답변

0

제안 된 구현은 상황을 처리하는 좋은 방법입니다. Loader은 이미 OnLoadCompleteOnLoadCanceled에 대한 콜백을 제공하기 때문에 시작 콜백 만 있으면됩니다. onForceLoad() 또는 onStartLoad()을 호출하는 OnLoadStart 콜백을 구현하면 loadInBackground이 아닌 기존 프레임 워크 콜백을보다 밀접하게 반영 할 수 있습니다.

프레임 워크 콜백과 마찬가지로 리스너를 생성자에서 전달하는 대신 등록 및 등록 해제하는 방법을 설정하여 프래그먼트가 정상 수명주기 및 참조의 일부로 첨부/제거 될 수 있음을 제안합니다 누출되지 않습니다. 언급했듯이 생성자에서이를 제거하는 방법으로 전달하면 누수로 간주됩니다.

+0

답장을 보내 주셔서 감사합니다. 그래서 메서드를 만드는 것과 같은 일을 제안하십시오 register (Fragment f) {mFragment = f; } 및 unregister() {mFragment = null}를 로더에서 호출하고 onAttach()/onDetach()에서 해당 메서드를 호출하여 누출을 방지 할 수 있습니까? – traninho

+0

그래, 그걸 좀 더 일반적으로 만들 것이고, 'Fragment'가 구현할 수있는 인터페이스를 전달할 수도 있습니다. 기본적으로'OnLoadCompleteListener'와'Loader'가 이미 가지고있는'OnLoadCanceledListener'와 똑같은 API ... – Devunwired

관련 문제