2013-06-05 52 views
21

Tôi rất thích khung Volley, nhưng tôi vẫn còn một số nghi ngờ về nó. Ví dụ: Volley xếp hàng với mẫu Trình tải như thế nào? Vì yêu cầu của nó được xử lý theo cách không đồng bộ, việc gọi nó trên nền không có ý nghĩa gì nhiều. Mặt khác, nếu chúng ta bỏ qua mô hình Loader, chúng ta sẽ hủy tải và nạp lại các tài nguyên cần thiết, nó lãng phí.Android Volley + Mô hình trình tải?

Khung làm việc của Volley hoạt động như thế nào với Trình tải trong Android?

Trả lời

4

AFAIK và tôi đã thấy trong các nguồn khác nhau, đáp ứng yêu cầu của bạn sẽ được lưu trữ, NẾU máy chủ gửi các bộ nhớ đệm thích hợp headers (ETag), và lần thứ hai bạn sẽ cố gắng để thực hiện một yêu cầu GET, đến cùng một url, bạn sẽ được cung cấp phản hồi từ số cache, thay vì gọi lại số Network. (theo mặc định Volley lưu trữ các yêu cầu bằng cách sử dụng key số URL).

Thêm Requests vào RequestQueue phải được thực hiện từ MainThread, vì không có ý nghĩa khi gọi chúng từ nền Thread.

+0

Tôi đã suy nghĩ về một tình huống mà người dùng xoay thiết bị trong khi tải. Hành vi bình thường của khung Volley sẽ hủy yêu cầu và khởi động lại chúng khi thay đổi định hướng được thực hiện. Sử dụng mẫu Loader sẽ bảo vệ trạng thái tải từ các thay đổi định hướng. – husrevo

+0

có. bạn nói đúng.không có thẳng, ngoài hộp có nghĩa là "kết nối lại" với yêu cầu đang chờ xử lý hoặc "giữ cho nó" đang chạy và nhận phản hồi về các thay đổi định hướng/Dừng hoạt động-Tiếp tục. –

+1

Bạn nên gọi nó từ chủ đề nền trong các tình huống như tải thông tin bổ sung cho thông báo đẩy trước khi nó hiển thị. Tuy nhiên, vì mục đích chung, tốt hơn nên gọi nó từ chủ đề chính. – Gabriel

1

Có thể thực hiện các yêu cầu đồng bộ với Volley qua lớp RequestFuture. Tôi đã không nhìn vào cá nhân này, nhưng có vẻ như bạn có thể tận dụng nó với một Loader để có được tốt nhất của cả hai thế giới (Cache của Volley với sự ổn định tải của Loader).

+0

Bằng cách này, 'Trình tải 'không thể trả về kết quả trung gian và cuối cùng. 'RequestFuture' chỉ trả về kết quả nhận được đầu tiên (đó là trung gian trong trường hợp bạn sử dụng bộ nhớ đệm); kết quả cuối cùng chỉ cập nhật bộ nhớ cache và không thể được truyền sang giao diện người dùng. –

+0

Điểm tốt. Tại thời điểm này, tôi sẽ không khuyên bạn nên sử dụng bộ tải ở tất cả, tôi nghĩ rằng họ có quá nhiều chi phí và nó tốt hơn để tạo ra giải pháp của riêng bạn từ thư viện bên ngoài như Retrofit hoặc Volley. – Gabriel

+0

Không cần yêu cầu đồng bộ. Nếu bạn mở rộng 'Loader ' thì bạn vẫn phải làm việc trong chuỗi nền. – Pijusn

12

Trình tải có thể đóng gói thực tế mọi thứ, bao gồm cả yêu cầu Volley. Khi Trình tải của bạn đóng gói một khung công tác đã xử lý nền cho bạn và gọi lại cho bạn về chủ đề chính, như Volley, việc triển khai trình tải của bạn không được kế thừa từ AsyncTaskLoader mà chỉ đơn giản là từ lớp cơ sở Loader. Sau đó, bạn sẽ bắt đầu yêu cầu Volley theo phương thức onForceLoad().

Khi bộ nạp của bạn nhận kết quả trở lại trên sợi chính thông qua gọi lại, nó chỉ cần đẩy nó vào Hoạt động/Phân đoạn bằng cách gọi deliverResult().

Trình tải của bạn cũng cần giữ tham chiếu đến yêu cầu Volley đang tiến hành để có thể hủy yêu cầu đó trong onStopLoading(). onStopLoading() không được gọi trong trường hợp thay đổi cấu hình như xoay màn hình, chỉ khi rời khỏi Hoạt động.

Điểm bất lợi duy nhất là Trình tải không có cơ chế tích hợp để truyền lỗi, còn Volley thì có. Vì vậy, trong gọi lại lỗi Volley bên trong Trình tải của bạn, bạn sẽ cần phân phối kết quả rỗng hoặc gửi một phát sóng cục bộ để thông báo cho Hoạt động/Phân đoạn của lỗi.

3

Tôi vừa xuất bản một bài viết về Volley và nó tích hợp vào dự án trên mẫu Trình tải. Cách tiếp cận nâng cao được hiển thị. Trạng thái của trình tải được định nghĩa đầy đủ và được hiển thị trong biểu đồ.

Điều: https://plus.google.com/117981280628062796190/posts/8b9RmQvxudb

Loader States Diagram