내 사용자가 파일을 클라우드로 다운로드하도록 허용 한 후 내 앱이 로더를 다시 시작하도록합니다. 내가 Android - onLoadFinished not called에서 토론을 언급 한 후 다음과 같은 방법로더가 다시 시작될 때 onLoadFinished가 항상 호출되지 않는 경우
public void reloadAfterOpenFromCloud() {
LoaderManager loaderManager = this.getLoaderManager();
loaderManager.restartLoader(0, bundle, this);
}
에 내 코드를 쓸 때
이전 onLoadFinished
항상 (무작위)가 호출되지 않는, 내가
public void reloadAfterOpenFromCloud() {
// https://stackoverflow.com/questions/16014992/android-onloadfinished-not-called
// This seems to be a realiable way, to make sure onCreateLoader and onLoadFinished will
// be called.
LoaderManager loaderManager = this.getLoaderManager();
Loader loader = loaderManager.getLoader(0);
if (loader != null) {
loaderManager.destroyLoader(0);
}
loaderManager.restartLoader(0, bundle, this);
}
에 내 코드를 수정
이렇게하면 onLoadFinished
을 호출 할 기회가 줄어 듭니다. 그러나 그래도 무작위로 발생합니다.
- 내 앱에서 캐시를 지우고 제거하십시오.
- 앱을 설치하십시오.
- 실행
reloadAfterOpenFromCloud
. 다시 말하지만 무작위로onLoadFinished
은 호출되지 않습니다.onLoadFinished
가 호출되지 않을 때 나는 다시reloadAfterOpenFromCloud
을 실행하면
는, onLoadFinished
가 호출됩니다.
나는 최신 com.android.support:support-v4:25.0.0
과 targetSdkVersion 25
을 사용하고 있습니다.
로더가 다시 시작될 때 onLoadFinished
이 항상 호출되는 것을 확인할 수있는 실질적인 해결 방법이 있습니까?
다음은 내 코드 단편의 일부입니다.
public void reloadAfterOpenFromCloud() {
// https://stackoverflow.com/questions/16014992/android-onloadfinished-not-called
// This seems to be a realiable way, to make sure onCreateLoader and onLoadFinished will
// be called.
LoaderManager loaderManager = this.getLoaderManager();
Loader loader = loaderManager.getLoader(0);
if (loader != null) {
loaderManager.destroyLoader(0);
}
loaderManager.restartLoader(0, bundle, this);
}
static class HomeMenuRowInfosLoader extends AsyncTaskLoader<List<HomeMenuRowInfo>> {
private List<HomeMenuRowInfo> homeMenuRowInfos = null;
public HomeMenuRowInfosLoader(Context context) {
super(context);
}
@Override
public List<HomeMenuRowInfo> loadInBackground() {
...
return homeMenuRowInfos;
}
/**
* Handles a request to cancel a load.
*/
@Override
public void onCanceled(List<HomeMenuRowInfo> homeMenuRowInfos) {
super.onCanceled(homeMenuRowInfos);
}
/**
* Handles a request to stop the Loader.
* Automatically called by LoaderManager via stopLoading.
*/
@Override
protected void onStopLoading() {
// Attempt to cancel the current load task if possible.
cancelLoad();
}
/**
* Handles a request to start the Loader.
* Automatically called by LoaderManager via startLoading.
*/
@Override
protected void onStartLoading() {
if (this.homeMenuRowInfos != null) {
deliverResult(this.homeMenuRowInfos);
}
if (takeContentChanged() || this.homeMenuRowInfos == null) {
forceLoad();
}
}
/**
* Handles a request to completely reset the Loader.
* Automatically called by LoaderManager via reset.
*/
@Override
protected void onReset() {
super.onReset();
// Ensure the loader is stopped
onStopLoading();
// At this point we can release the resources associated with 'apps'
// if needed.
this.homeMenuRowInfos = null;
}
}
@Override
public Loader<List<HomeMenuRowInfo>> onCreateLoader(int arg0, Bundle bundle) {
return new HomeMenuRowInfosLoader(this.getActivity());
}
// Not being called always when restart loader
@Override
public void onLoadFinished(Loader<List<HomeMenuRowInfo>> arg0, List<HomeMenuRowInfo> homeMenuRowInfos) {
...
'HomeMenuRowInfosLoader' 클래스의 전체 코드를 추가하십시오. 나는 특히 onContentChanged()가 호출 될 때 관심이있다. –
@krislarson 코드를 업데이트했습니다. 고맙습니다. –