2013-05-12 45 views
14

Với những gì tôi hiểu, khung công tác Loader hướng đến việc truy cập dữ liệu được lưu trữ cục bộ trong cơ sở dữ liệu ContentProvider/SQLite. Chúng ta có lớp CursorLoader xử lý trường hợp sử dụng này khá tốt. Nhưng tôi tự hỏi liệu có thực tế khi sử dụng khung Loader để viết các lớp mở rộng Loader/AsyncTaskLoader để truy cập các dịch vụ web từ xa (ví dụ: dịch vụ web REST) ​​không? Tôi luôn nghĩ rằng khung công tác này hơi quá cứng nhắc và khó hiểu (thiếu tài liệu thích hợp) cho trường hợp sử dụng này. Tôi thích xử lý các cuộc gọi REST theo cách thông thường hơn, bằng cách sử dụng AsyncTasks/Services. Nhưng gần đây tôi đã tìm thấy một số bài viết sử dụng AsyncTaskLoaders và bắt đầu tự hỏi.Trình tải có nên được sử dụng để truy cập các dịch vụ web không?

Vậy tại sao mọi người sử dụng Trình tải để truy cập Dịch vụ web? Ưu điểm duy nhất tôi thấy ở đây là Loaders tự động giữ lại kết quả của họ. Không có con trỏ ở đây để quản lý sau đó.

+0

Bạn có thể chia sẻ hướng dẫn bạn đang đề cập đến không? –

+0

Ở đây bạn đi: http://neilgoodman.net/2011/12/26/modern-techniques-for-implementing-rest-clients-on-android-4-0-and-below-part-1/ –

Trả lời

11

Thực tế, bạn có thể muốn sử dụng thư viện mạng như Volley. Điều này có một số tính năng tốt đẹp như yêu cầu batching và bộ nhớ đệm hình ảnh. Tuy nhiên, vì lợi ích của đối số cho phép so sánh Service, Loader s và AsyncTask.

Dịch vụ là cách để đi nếu bạn muốn cho phép tải tiếp tục trong khi thay đổi Hoạt động hoặc nền ứng dụng của bạn. Hoặc, nếu bạn muốn xuất dịch vụ của mình để nhiều ứng dụng có thể sử dụng nó. Nếu không, hãy sử dụng Trình tải hoặc AsyncTaskLoader.

Trình tải có một số lợi thế so với AsyncTasks.

  • Chúng ít có khả năng gây ra sự cố bằng cách thực thi mã sau khi Hoạt động kết thúc vì chúng biết về vòng đời của Android.
  • Thiết kế không khuyến khích tham chiếu đến View s hoặc Hoạt động. Điều này làm giảm khả năng buộc Hoạt động ở lại trong bộ nhớ sau khi nó đã kết thúc.
  • Theo dõi nguồn dữ liệu cho các thay đổi và kích hoạt gọi lại khi chúng xuất hiện
  • Chúng đã tích hợp bộ nhớ đệm có thể hữu ích sau khi xoay. Đối với Cursor s, CursorLoader tự động kết nối lại tại đúng vị trí cho con trỏ cuối cùng được tải

Tuy nhiên, họ cũng có nhược điểm

  • API là vô cùng cồng kềnh hơn hơn AsyncTask. Đặc biệt nếu bạn quan tâm đến khả năng tương thích với các phiên bản cũ hơn của Android
  • Bạn đã lưu trữ trạng thái giao diện người dùng bên trong onSaveInstanceState(), do đó, bạn có thể lưu trạng thái của một số nguyên nhân theo cách khác nhau của Loader. Điều này có thể gây nhầm lẫn khi đọc và hiểu. Đặc biệt là nếu bạn kết thúc việc trộn các mảnh vỡ đã được giữ lại vào hỗn hợp.
  • Các Loader lưu trữ kết quả tải, không phải là trạng thái UI mà bạn thực sự cần

tôi giả sử bạn chỉ đọc từ các dịch vụ web, không viết. Nếu bạn đang thực hiện cập nhật cho một dịch vụ web và bạn cần xem phản hồi của dịch vụ, thì điều này sẽ thay đổi mọi thứ. Sử dụng AsyncTask có thể khiến bạn không nhận được phản hồi nếu nhận được phản hồi trong khi quay.

2

Có những trường hợp Trình tải phù hợp cho dịch vụ web: Khi máy chủ của bạn có thể gửi thông báo đẩy quay lại máy khách để thông báo rằng dữ liệu đã được thay đổi.

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