2013-04-15 4 views
5

로더와 관련된 문제가 있습니다.Android - onLoadFinished가 호출되지 않았습니다.

로컬 DB에서 검색 한 레코드 목록을 표시하는 활동이 있습니다. 활동이 시작되면 LoaderManager.initLoader() 메소드를 통해 레코드가 자동으로로드됩니다.

ActionBarSherlock의 새로 고침 버튼을 사용하여 수동으로 목록을 새로 고칠 수도 있습니다. 그러나 DB에 레코드를 추가하는 다른 활동을 마친 후에는 onLoadFinished가 호출되지 않습니다. 여기 SimpleCursorLoader 등을 사용하고

는 활동에서 코드입니다 :

@Override 
public void onStart() { 
    ... 
    getSupportLoaderManager().initLoader(0, null, this); 
} 

@Override 
public void onPause() { 
    ... 
    getSupportLoaderManager().destroyLoader(0); 
} 

public void refreshRecords() { 
    getSupportLoaderManager().restartLoader(0, null, this); 
} 

@Override 
public Loader<Cursor> onCreateLoader(int id, final Bundle args) { 
Loader<Cursor> l = new SimpleCursorLoader(this) { 
    @Override 
    public Cursor loadInBackground() { 
     return recordDAO.getCursor(); 
    } 
}; 
l.forceLoad(); 
return l; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor c) { 
    // updateUI 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
} 

문제는 다른 활동을 마친 후, onLoaderCreate를 호출 할 때,하지만 onLoaderFinished가 호출되지 않습니다.

디버깅 후

, 나는 새싹 내가 뭔가를 놓치고 있습니까

.. if (isReset()) { ..에 끝, SimpleCursorAdapter.deliverResults()도 불린다 것으로 나타났습니다? 강제로 데이터를 다시로드하는 방법?

내가 마지막으로

https://groups.google.com/forum/#!topic/android-developers/DbKL6PVyhLI

public static <T> void initLoader(final int loaderId, final Bundle args, final LoaderCallbacks<T> callbacks, 
     final LoaderManager loaderManager) { 
    final Loader<T> loader = loaderManager.getLoader(loaderId); 
    if (loader != null && loader.isReset()) { 
     loaderManager.restartLoader(loaderId, args, callbacks); 
    } else { 
     loaderManager.initLoader(loaderId, args, callbacks); 
    } 
} 

답변

14

미리 감사합니다, 나는 즉시 다시 시작하려고 시도 비슷한 문제가 있었다 첫 번째 onLoadFinished가 호출되기 전에 두 번째 로더가 호출되어 아무 것도 호출되지 않습니다.

은 나를 위해 일한 :

if(loader == null) 
    loader = loaderMngr.initLoader(
     0, null, myLoaderCallbacks 
     ); 
else if(loader.isAbandoned()) 
    return; 
else 
    loaderMngr.restartLoader(
     0, null, myLoaderCallbacks 
     );  
+0

저에게 맞습니다. 고맙습니다. –

+7

나를 위해 작동하지 않습니다! – Radu

+3

거의 정확한 해결책 : https://groups.google.com/forum/#!topic/android-developers/DbKL6PVyhLI에서 설명한 바와 같이 리셋 조건은! loader.isReset()입니다. 즉, '로더가 재설정되지 않으면 로더를 다시 시작해야합니다.' (에티엔 느가 쓴). 답변을 업데이트하십시오. – Pascal

1

FWIW에 토론이 문제 덕분에 해결책을 발견

4

랩 솔루션은

내 해결책 일 나를 위해 일 해달라고 항상 다시 시작 또한

Loader<Cursor> loader = mLoaderManager.getLoader(mKeyLoader); 
if (loader != null) 
{ 
    mLoaderManager.destroyLoader(mKeyLoader); 
} 
mLoaderManager.restartLoader(mKeyLoader, args, this); 
+0

나를 위해 일했습니다. 고마워요! – szidijani

+0

감사. 마지막으로 강제로 로더가 항상 onLoadFinished 메소드를 호출해야하는 이유를 발견했습니다. – MistaGreen

1

전에 로더를 파괴했다 RAB의 대답에 맞춤 Loader을 사용하는 경우 super으로 전화하면 쓰기 deliverResult() :

@Override 
public void deliverResult(D data) { 
    super.deliverResult(data); // <--onLoadFinished() will not be called if you don't call this 
    ... 
}