2011-10-18 61 views
10

我有一個活動,它在創建時調用initLoader以加載活動將顯示的數據。通常情況下,這工作正常。我設置了斷點來查看所有事情發生的順序。首先我調用initLoader,然後得到OnCreateLoader回調,然後是OnLoadFinished回調,然後一切都很好。有時在調用initLoader之後不會獲得onCreateLoader回調

但是,我注意到如果我改變Android的方向,我沒有得到OnCreateLoader回調或OnLoadFinished回調,導致頁面上沒有數據顯示。我仍然在initLoader調用中獲得了斷點,所以我知道這種情況正在發生,但是我沒有收到錯誤,我找不到任何文檔解釋爲什麼在調用initLoader之後我不會得到回調。

有趣的是,如果我回到原來的方向,我會得到回調。

因此,要總結:

我開始活動在縱向方向

  • 我打電話initLoader
  • 我得到onCreateLoader和onLoadFinished回調

我則改爲橫向

  • 我打電話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中看到與碎片相同的問題。看起來,當片段恢復時,裝載器不能再次被正確地激活。實際上,當片段暫停時,我們的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

我花了幾個星期的追蹤這個問題。把以前的片段內容放到我的新片段中已經很累了。 終於修好了。

在我的onCreate()方法,該方法的片段來實現LoaderManager,我這樣做

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); 
    } 
相關問題