2011-10-18 34 views
10

Tôi có một hoạt động gọi initLoader khi nó được tạo để tải dữ liệu mà hoạt động sẽ hiển thị. Thông thường, điều này hoạt động tốt. Tôi đã thiết lập các điểm ngắt để xem thứ tự mà mọi thứ xảy ra. Đầu tiên tôi gọi initLoader, sau đó tôi nhận được gọi lại OnCreateLoader, sau đó gọi lại OnLoadFinished, sau đó tất cả mọi thứ là rất tốt.Đôi khi không nhận được gọi lại onCreateLoader sau khi gọi initLoader

Tuy nhiên, tôi nhận thấy rằng nếu tôi thay đổi hướng trên Android của mình mà tôi không nhận được cuộc gọi lại OnCreateLoader hoặc gọi lại OnLoadFinished, kết quả là không có dữ liệu được hiển thị trên trang. Tôi vẫn nhận được breakpoint của tôi trên lời gọi initLoader vì vậy tôi biết điều đó đang xảy ra, nhưng tôi không gặp lỗi và tôi không thể tìm thấy bất kỳ tài liệu nào giải thích lý do tại sao tôi sẽ không nhận được cuộc gọi lại sau khi gọi initLoader.

Thật thú vị, tôi nhận được cuộc gọi lại nếu tôi quay lại hướng ban đầu.

Vì vậy, để tóm tắt:

tôi bắt đầu hoạt động theo hướng dọc

  • tôi gọi initLoader
  • tôi nhận được onCreateLoader và onLoadFinished callbacks

sau đó tôi chuyển sang cảnh quan

    .210
  • tôi gọi initLoader
  • không onCreateLoader hoặc callbacks onLoadFinished

tôi thay đổi trở lại chân dung

  • tôi gọi initLoader
  • tôi nhận được onCreateLoader và onLoadFinished callbacks

Tương tự như vậy, nếu tôi bắt đầu hoạt động ở chế độ ngang, tôi sẽ nhận được cuộc gọi lại. Sau đó, nếu tôi chuyển sang chân dung, tôi thì không. Sau đó, nếu tôi chuyển về cảnh quan, tôi sẽ nhận được cuộc gọi lại.

Có ai có ý tưởng gì đang xảy ra không?

Trả lời

2

Tôi đã truy tìm vấn đề này

ban đầu tạo (OnActivityCreated)

initLoader -> OnCreateLoader -> OnOnStartLoading -> OnLoadFinished

Hướng chan ge - OnActivityCreated được gọi lại là

initLoader - OnLoadFinished (Không tải bất kỳ dữ liệu nào!) - lỗi.

Cách giải quyết duy nhất mà tôi tìm thấy là gọi hàm destroyLoader() ngay trước init. Điều này bắt buộc trình tự Tạo/Bắt đầu/Hoàn thành thích hợp xảy ra.

gì dường như xảy ra là mã initLoader được ghi vào giả định các mảnh không bị phá hủy trong một cuộc thay đổi hướng, đó là tất nhiên không phải là cách phần còn lại của công trình android ..

+2

đây là cách ment của nó để làm việc. Nếu gọi init trên một bộ nạp đã tải dữ liệu của nó, nó sẽ chỉ trả về dữ liệu đó thông qua onLoadFinished. Bạn nên xem http://developer.android.com/reference/android/app/LoaderManager.html#restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks ) để tải lại dữ liệu – Dori

9

Chúng tôi đã thấy cùng một vấn đề này với Fragments trong ViewPager. Dường như các trình nạp không được kích hoạt lại đúng cách khi một đoạn được nối lại. Trong thực tế, khi đoạn bị tạm dừng, CursorLoader của chúng tôi không còn nhận được các cuộc gọi lại của ContentObserver như tôi mong đợi.

Cách giải quyết của chúng tôi là gọi hàm restartLoader() để loại bỏ các nội dung trước đó và tải lại dữ liệu. Điều này sẽ có ảnh hưởng ròng giống như destroyLoader(); initLoader(), nhưng nó sẽ hiệu quả hơn.

+2

Tôi thích bạn người đàn ông !! Tôi đã bashing đầu của tôi về vấn đề này trong nhiều giờ, bạn đã tiết kiệm cho tôi rất nhiều thần kinh. – user2758776

1

Tôi đã có một điều tương tự xảy ra với bộ điều hợp con trỏ trong các đoạn trên thay đổi hướng. initloader được gọi trong onCreateView (cũng đã thử onStart và onResume) nhưng onCreatLoader cũng như các phương thức gọi lại của trình nạp khác không bao giờ được gọi. Cũng lưu ý trong trường hợp của tôi mảnh vỡ được chứa trong một máy nhắn tin xem.

Vì vậy, ban đầu, hoạt động và xem máy nhắn tin và các phân đoạn đã được tạo và mọi thứ hoạt động. Về sự thay đổi định hướng mặc dù các danh sách trong các mảnh của tôi sẽ không nhận được dữ liệu. Thay đổi định hướng một lần nữa và dữ liệu đã trở lại.

Trong trường hợp của tôi sửa chữa đã được thay đổi này:

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

tôi đã thay đổi nó để này

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

tôi đã dành tuần về theo dõi vấn đề này. Thật mệt mỏi khi đưa nội dung đoạn trước đó vào đoạn mới của tôi. Cuối cùng đã được sửa.

Trong phương pháp của tôi onCreate() trong đó đoạn thực hiện LoaderManager, tôi đã làm điều này

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

Nó hoạt động khi nạp mới không được actived đúng cách.

0

Tôi gặp sự cố này gần đây và muốn gửi giải pháp của mình.

tôi thấy nó chỉ đơn giản là đủ để chỉ làm:

Loader<Cursor> loader = getActivity().getLoaderManager().getLoader(LOADERID); 

    if (loader == null) { 
     getActivity().getLoaderManager().initLoader(LOADERID, null, this); 
    } else { 
     getActivity().getLoaderManager().restartLoader(LOADERID, null, this); 
    } 
Các vấn đề liên quan