39

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

49

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 AcivitiesFragments. 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(); 
    } 
} 
+1

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

+0

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. –

+0

@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

17

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().

http://developer.android.com/guide/components/loaders.html

Các vấn đề liên quan