2016-11-09 14 views
0

내 사용자가 파일을 클라우드로 다운로드하도록 허용 한 후 내 앱이 로더를 다시 시작하도록합니다. 내가 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을 호출 할 기회가 줄어 듭니다. 그러나 그래도 무작위로 발생합니다.

  1. 내 앱에서 캐시를 지우고 제거하십시오.
  2. 앱을 설치하십시오.
  3. 실행 reloadAfterOpenFromCloud. 다시 말하지만 무작위로 onLoadFinished은 호출되지 않습니다. onLoadFinished가 호출되지 않을 때 나는 다시 reloadAfterOpenFromCloud을 실행하면

는, onLoadFinished가 호출됩니다.

나는 최신 com.android.support:support-v4:25.0.0targetSdkVersion 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) { 
    ... 
+0

'HomeMenuRowInfosLoader' 클래스의 전체 코드를 추가하십시오. 나는 특히 onContentChanged()가 호출 될 때 관심이있다. –

+0

@krislarson 코드를 업데이트했습니다. 고맙습니다. –

답변

0

당신은 사용자가 클라우드 파일 전송을 완료하면 onContentChanged()를 호출하여 HomeMenuRowInfosLoader에서 관찰자의 일종을 구현해야합니다. onContentChanged()가 호출되지 않은 경우

, takeContentChanged() 항상 false을 반환하고 forceLoad() 포인트 homeMenuRowInfos를 null 같지되는 첫 번째로드 후 onStartLoading() 내에서 호출되지 않습니다.

+0

디버그를했습니다. 'forceLoad'가 호출되면, "onLoadFinished가 호출되지 않습니다"라는 문제가 발생합니다. –

+0

모든 'restartLoader'에 대해'forceLoad'가 일치하지만'onLoadFinished'가 나오지 않으면, 그게 무엇인지 모르겠습니다. 'loadInBackground'에서 항상'homeMenuRowInfos = new ArrayList <>()'를 할 것인가 아니면리스트를 재사용 할 것인가? 새 데이터 == 이전 데이터 인 경우'onLoadFinished'를 건너 뛰는 것처럼 보이는 일부 코드가'LoaderManager'에 있습니다. –