2013-04-15 11 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が呼び出されません。いくつかのデバッグの後、私はSimpleCursorAdapter.deliverResults()とも呼ばれていること

を見つけた、つぼみは.. if (isReset()) { ..

に終わる私は何かが足りないのですか?どのようにデータのリロードを強制するのですか?

は私が最終的にこの問題を解決するには、

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が呼び出される前に2回目にローダーが呼び出され、どちらも呼び出されませんでした。

これは私の仕事:

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

RABソリューションは、私は、ソリューションを働いた

、常にRABの答えに加えて、再起動

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

私のために働いた、ありがとう! – szidijani

+0

ありがとうございます。私は最終的にローダーが常にonLoadFinishedメソッドを呼び出すように強制する理由を見つけました。 – MistaGreen

1

前にローダーを破壊した私のために働くいけませんカスタムLoaderを使用している場合は、superに電話すると書き込みdeliverResult()

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