2011-10-18 2 views
10

アクティビティが表示されるデータをロードするために、initLoaderを作成するときにinitLoaderを呼び出すアクティビティがあります。通常、これは正常に動作します。私はすべてが起こる順序を見るために設定されたブレークポイントを持っています。最初にinitLoaderを呼び出し、次にOnCreateLoaderコールバックを取得し、次にOnLoadFinishedコールバックを取得します。時々、initLoaderを呼び出した後にonCreateLoaderコールバックを取得しないでください。

しかし、Androidの向きを変更しても、OnCreateLoaderコールバックやOnLoadFinishedコールバックが得られず、ページにデータが表示されないことに気付きました。私はまだinitLoaderコールでブレークポイントを取得しているので、それが起こっていることは分かっていますが、エラーは発生せず、なぜinitLoaderをコールした後にコールバックを取得できないのかの説明を見つけることができません。

興味深いことに、私が元の向きに戻った場合、私はコールバックを取得します。

ので、要約する:

を私はその後、風景

に変更私はonCreateLoaderとonLoadFinishedコールバック

を取得

  • initLoader
  • 呼び出す

    • 縦向きに活動を開始します
      • は私が、私はinitLoader
      • 呼び出す私はonCreateLoader取得し、同様にコールバック

      をonLoadFinishedバック肖像

      • に変更initLoader
      • なしonCreateLoaderまたはonLoadFinishedコールバック

      呼び出します私がランドスケープモードでアクティビティを開始すると、私はコールバックを取得します。その後、私がポートレートに切り替えると、私はしません。次に、私がランドスケープに戻ると、私はコールバックをもう一度取得します。

      誰が何が起こっているか考えている人はいますか?

    答えて

    2

    を見て

    初期作成(OnActivityCreated)

    initLoader - > OnCreateLoader - > OnOnStartLoading - > OnLoadFinished

    オリエンテーションちゃんge - OnActivityCreatedが再び呼び出されました

    initLoader - OnLoadFinished(データをロードせずに) - バグ。

    私が見つけた唯一の回避策は、initの直前にdestroyLoader()を呼び出すことです。これにより、適切な作成/開始/終了シーケンスが強制的に実行されます。何が起こっているように見えることinitLoaderコードがフラグメントを想定して書かれている

    はもちろんありませんどのようにアンドロイドの作品の残りの部分である姿勢の変化、中に破壊されていません。..

    +2

    これはそのメンターが動作する方法です。既にデータをロードしているローダーでinitを呼び出すと、onLoadFinishedを介してそのデータが返されます。データをリロードするにはhttp://developer.android.com/reference/android/app/LoaderManager.html#restartLoader(int、android.os.Bundle、android.app.LoaderManager.LoaderCallbacks )をご覧ください。 – Dori

    9

    我々はしましたViewPagerのFragmentsで同じ問題が発生しました。フラグメントが再開されたときに、ローダーが正しく再アクティブ化されないように見えます。実際、フラグメントが一時停止しているとき、CursorLoaderはContentObserverコールバックを私が期待するようにはもはや取得しません。

    私たちの回避策は、以前の内容をダンプしてデータをリロードするrestartLoader()を呼び出すことでした。これは、destroyLoader()と同じ効果があります。 initLoader()を使用しますが、より効率的です。

    +2

    私は大好きですあなた!!私は何時間もこの問題に頭を打っていました。あなたは私に多くの神経を救ってくれました。 – user2758776

    1

    私は、向きが変わったときにカーソルアダプタで起こっているのと非常によく似たことがありました。 initloaderはonCreateView(onStartとonResumeも試しました)で呼び出されましたが、onCreatLoaderだけでなく、他のローダーコールバックメソッドも呼び出されませんでした。私の場合、フラグメントはビューページャーに含まれていたことにも注意してください。

    最初、アクティビティとビューのページャとフラグメントが作成され、すべてが機能しました。私の断片のリストはデータを取得しませんが、オリエンテーションを変更します。方位を再び変えて、データが戻ってきました。修正プログラムは、この変更された

    は、私の場合:

    getActivity().getLoaderManager().initLoader(0, null, this); 
    

    を私はこの問題を追跡する上で数週間過ごしたこの

    getLoaderManager().initLoader(0, null, this); 
    
    0

    にそれを変更しました。以前の断片の内容を新しい断片に入れるのは疲れました。 最終的に修正されました。フラグメントはLoaderManagerを実装しているの私のonCreate()メソッドで

    は、私がやったこの

    getLoaderManager().initLoader(0, null, this); 
         if(!getLoaderManager().getLoader(0).isReset()) { 
          getLoaderManager().restartLoader(0, null, this); 
         } 
    

    新しいローダーが正しくactivedされなかったとき、それは動作します。

    0

    最近この問題が発生しましたが、解決策を提出したいと考えています。

    私はそれだけで行うには、単純に十分だったが見つかりました:

    Loader<Cursor> loader = getActivity().getLoaderManager().getLoader(LOADERID); 
    
        if (loader == null) { 
         getActivity().getLoaderManager().initLoader(LOADERID, null, this); 
        } else { 
         getActivity().getLoaderManager().restartLoader(LOADERID, null, this); 
        } 
    
    関連する問題