Tôi hiện đang chuyển ứng dụng của mình sang gói tương thích với Android (chủ yếu cho CursorLoader and Fragments). Tôi hiện đang cố gắng chia sẻ một CursorLoader giữa hai đoạn để dành một truy vấn cho ContentProvider của tôi. Chào mừng đến với thế giới của tôi! ;)
Một trường hợp sử dụng đơn giản:.
- DummyActivity kéo dài FragmentActivity/Log.d (Constants.LOGTAG, "DummyActivity.onCreate" + getSupportLoaderManager() toString());
- DataFragment mở rộng các cài đặt Fragment LoaderManager.LoaderCallbacks/Log.d (Constants.LOGTAG, "DataFragment.onCreate" + getLoaderManager(). ToString());
- Báo cáoPhân tích mở rộng Hoạt động phân mảnh LoaderManager.LoaderCallbacks/Log.d (Constants.LOGTAG, "ReportFragment.onCreate" + getLoaderManager(). ToString());
DummyActivity instanciates DataFragment và sau đó instanciates ReportFragment. Đầu ra logcat hiển thị các địa chỉ differents cho mỗi LoaderManager. Như một kết luận đầu tiên, mỗi Fragment dường như có một LoaderManager phù hợp…
Tôi sẽ tiếp tục và cập nhật nếu tôi có thể trả lời câu hỏi (của chúng tôi)). Nếu bạn đã thực hiện bất kỳ tiến bộ nào, vui lòng chia sẻ kiến thức có giá trị của bạn.
Cập nhật:
giả định của tôi là rằng id nạp chỉ được kết hợp với một phạm vi địa phương của một LoaderManager cho một đoạn cụ thể để cho phép nhiều bộ tải địa phương có liên quan đến phần phân đoạn (để bạn có thể trả về một bộ nạp khác nhau trong onCreateLoader dựa trên id int arg và các lời gọi initLoader).
Cho đến nay tôi quản lý để "tái sử dụng" một Loader (... hay không):
- Trước tiên, tôi đã kích hoạt LoaderManager gỡ lỗi với getSupportLoaderManager().enableDebugLogging(true);
trong phương pháp DummyActivity onCreate
.
- Sau đó, tôi đã gọi getActivity().getSupportLoaderManager().initLoader(78, null, this);
từ các phương pháp onCreate
của cả DataFragment và ReportFragment.
- DataFragment hiển thị CursorLoader được tạo bởi phương thức onCreateLoader
thông qua trình thiết lập trên thành viên riêng tư mCursorLoader.
- Báo cáoFragment onCreateLoader
trả về Trình nạp con trỏ DataFragment (sau khi truy xuất Phân đoạn bằng findFragmentByTag
).
Các lọc (và hơi obfuscated) đầu ra logcat:
DummyApp D DummyActivity.onCreate
DummyApp D DataFragment.newInstance
DummyApp D ReportFragment.newInstance
DummyApp D DataFragment.onCreate
LoaderManager V initLoader in LoaderManager{405a19d0 in SpecificAction{4059ee98}}: args=null
DummyApp D DataFragment.onCreateLoader
LoaderManager V Created new loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
DummyApp D DataFragment.onCreate
DummyApp D DataFragment.onActivityCreated
DummyApp D ReportFragment.onCreate
LoaderManager V initLoader in LoaderManager{405a19d0 in DummyActivity{4059ee98}}: args=null
LoaderManager V Re-using existing loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
DummyApp D SpecificActionReportFragment.onCreate
DummyApp D SpecificActionReportFragment.onActivityCreated
LoaderManager V Starting in LoaderManager{405a19d0 in DummyActivity{4059ee98}}
LoaderManager V Starting: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
DummyProvider D query called
DummyProvider D […]
DummyProvider D [end of query]
LoaderManager V onLoadComplete: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
LoaderManager V onLoadFinished in CursorLoader{405a22e0 id=78}: CursorWrapperInner{405afb20}
DummyApp D ReportFragment.onLoadFinished
DummyApp D ReportFragment.displayActionReport
DummyApp D DummyActivity.setReportViewsVisibility
DummyApp D ReportFragment.setSaveReportImageViewVisibility
Hai mảnh vỡ được thêm vào từ phương pháp DummyActivity onCreate
(khác với trường hợp sử dụng mô tả, nhưng điều đó có gì thay đổi đến vấn đề chúng tôi đang làm việc trên). Thật không may, bộ nạp được gán lại cho đoạn mới nhất gọi nó (ở đây là ReportFragment) ... và DataFragment.onLoadFinished không bao giờ được gọi. Kết quả là, ReportFragment có vẻ tốt nhưng DataFragment không được cập nhật vì bản cập nhật được gọi từ lớp onLoadFinished
của lớp này.
Tôi giả định rằng có cuộc gọi không đăng ký cơ bản sau đó là cuộc gọi đăng ký trên CursorLoader.
Để được tiếp tục…
[** Hiểu về Trình quản lý tải (phần 2) **] (http://www.androiddesignpatterns.com/2012/05/why-you-should-use-loadermanager.html) –