Tôi có hệ thống tải dữ liệu được thiết lập bằng Trình tải và Con trỏ tùy chỉnh hoạt động tốt từ Hoạt động và Phân đoạn nhưng không có Trình quản lý tải (mà tôi có thể tìm thấy) trong Dịch vụ. Có ai biết tại sao LoaderManager bị loại trừ khỏi Dịch vụ không? Nếu không có cách nào xung quanh điều này?Bạn có thể sử dụng Trình quản lý tải từ một Dịch vụ không?
Trả lời
Có ai biết tại sao LoaderManager được loại trừ khỏi dịch vụ?
Như đã nêu trong câu trả lời khác, LoaderManager
được thiết kế một cách rõ ràng để quản lý Loaders
qua vòng đời của Acivities
và Fragments
. Vì Services
không có các thay đổi cấu hình này để xử lý, việc sử dụng LoaderManager
là không cần thiết.
Nếu không có cách nào xung quanh vấn đề này?
Vâng, Bí quyết là bạn không cần phải sử dụng một LoaderManager
, bạn chỉ có thể làm việc với Loader
của bạn trực tiếp, mà sẽ xử lý không đồng bộ tải dữ liệu của bạn và theo dõi bất kỳ thay đổi dữ liệu cơ bản cho bạn, mà là tốt hơn nhiều hơn là truy vấn dữ liệu của bạn theo cách thủ công.
Trước tiên, tạo, đăng ký và bắt đầu tải Loader
khi bạn tạo Service
.
@Override
public void onCreate() {
mCursorLoader = new CursorLoader(context, contentUri, projection, selection, selectionArgs, orderBy);
mCursorLoader.registerListener(LOADER_ID_NETWORK, this);
mCursorLoader.startLoading();
}
Tiếp theo, thực hiện OnLoadCompleteListener<Cursor>
trong Service
để xử lý callbacks tải của bạn.
@Override
public void onLoadComplete(Loader<Cursor> loader, Cursor data) {
// Bind data to UI, etc
}
Cuối cùng, đừng quên dọn sạch Loader
khi Service
bị hủy.
@Override
public void onDestroy() {
// Stop the cursor loader
if (mCursorLoader != null) {
mCursorLoader.unregisterListener(this);
mCursorLoader.cancelLoad();
mCursorLoader.stopLoading();
}
}
Thật không may, không. Trình tải được thiết kế cho các hoạt động và các đoạn để xử lý sạch các thay đổi cấu hình xảy ra trong Activites và Fragments. tức là Xoay thiết bị của bạn và gắn lại với dữ liệu hiện có.
Dịch vụ không có bất kỳ thay đổi cấu hình nào, dịch vụ sẽ nằm ở chế độ nền cho đến khi hoàn thành hoặc hệ thống bị buộc phải tiêu diệt. Vì vậy, giả sử bạn đang thực thi mã của bạn trên một chuỗi nền trong Dịch vụ của bạn (mà bạn nên được anyways), theres chỉ không có lý do để sử dụng một Loader. Chỉ cần thực hiện các cuộc gọi bạn cần để truy vấn dữ liệu của bạn.
Vì vậy, nếu Dịch vụ của bạn chỉ là IntentService, bạn có thể viết logic của mình để truy vấn dữ liệu được trỏ chuột của bạn trong phương thức onHandleIntent().
- 1. Tôi có phải sử dụng Phân đoạn để tải Trình quản lý tải không?
- 2. cho phép ứng dụng Android cần sử dụng Dịch vụ Trình quản lý báo thức?
- 3. Nhà máy quản lý-dịch vụ của Aries có quản lý tài sản không?
- 4. Timer Task VS Sử dụng Trình quản lý báo động trong Dịch vụ Android
- 5. Ẩn chương trình C# từ trình quản lý tác vụ?
- 6. Android: Cách sử dụng lớp trình quản lý tải xuống?
- 7. Trình tải có nên được sử dụng để truy cập các dịch vụ web không?
- 8. Tôi làm cách nào để sử dụng Trình quản lý vai trò trong Dịch vụ WCF?
- 9. Sử dụng lại trình quản lý thực thể bởi em.clear() hoặc tạo một trình quản lý đối tượng mới?
- 10. Vượt qua Trình quản lý thực thể của Doctrine đến một dịch vụ
- 11. Mẫu cho nhiều Trình tải với Trình quản lý tải?
- 12. Có thể gọi một DLL được quản lý từ C++ không được quản lý?
- 13. Cập nhật giao diện người dùng từ một dịch vụ (sử dụng trình xử lý?)
- 14. Có thể chạy C++ không được quản lý bình thường từ một dự án C++/CLI được quản lý không?
- 15. Mùa xuân - Có thể sử dụng nhiều người quản lý giao dịch trong cùng một ứng dụng không?
- 16. Bạn có thể truy vấn Trình quản lý tải xuống trên Chủ đề giao diện người dùng không?
- 17. Trình quản lý giao dịch Spring có ràng buộc kết nối với một luồng không?
- 18. Grails nhận Phiên và Quản lý trong lớp Dịch vụ
- 19. Trình quản lý tải xuống bằng Java
- 20. Có thể sử dụng AsyncTask trong lớp Dịch vụ không?
- 21. Cách sử dụng mã được quản lý từ mã không được quản lý?
- 22. Bạn có thể tìm ra trình biên dịch nào được sử dụng để biên dịch chương trình không?
- 23. Dịch vụ Windows với công cụ quản lý WPF
- 24. Làm cách nào để ngăn ứng dụng/dịch vụ Android của tôi bị "giết" khỏi trình quản lý tác vụ?
- 25. Sử dụng dịch vụ REST từ WCF
- 26. Cột Trình quản lý tác vụ Windows - Xử lý
- 27. Lập trình loại bỏ một dịch vụ sử dụng C#
- 28. Gọi một dll C++ (mã không được quản lý) từ dịch vụ C# windows (được viết bằng mã được quản lý)
- 29. Tạo dịch vụ WCF cho các máy khách C++ không được quản lý
- 30. Phạm vi của Trình quản lý tải là gì?
thật thú vị. Giả sử chúng ta đang ở đâu đó ở giữa việc thực thi 'onLoadComplete' và thay đổi dữ liệu con trỏ. Việc thực thi 'onLoadComplete' có dừng đột ngột và bắt đầu lại bằng con trỏ mới không? Tôi chỉ cố gắng để hiểu làm thế nào để duyên dáng xử lý một làm mới dữ liệu trong khi lặp qua con trỏ trong một dịch vụ. – faizal
Từ những gì tôi đã thấy, vì 'onLoadComplete' được gọi trên luồng chính' Service's', bất kỳ lệnh gọi tiếp theo nào đến 'onLoadComplete' sẽ đơn giản là ngăn xếp và thực hiện với một' Cursor' mới sau khi kết thúc 'onLoadComplete' ban đầu. Điều này sẽ gần như chính xác giống như hành vi bạn sẽ nhận được với một 'LoaderManager' gọi' onLoadFinished' từ một số thay đổi dữ liệu tiếp theo. –
@StevenByle Tôi nghĩ bạn cũng nên gọi 'mCursorLoader.reset() 'để đóng con trỏ. Theo mã nguồn, 'reset()' sẽ gọi 'onStopLoading();' (tương đương với 'stopLoading') và sau đó sẽ đóng con trỏ. Tôi nghĩ, nếu không con trỏ sẽ không bị đóng. – MyDogTom