11

Trong một ứng dụng Android, tôi phải thực hiện nhiều yêu cầu GET cho một URL để truyền dữ liệu đến một máy chủ bên ngoài (đó là cách API của bên thứ ba hoạt động).Cách tốt nhất để gửi yêu cầu HTTP GET không đồng bộ trong Android là gì?

Dữ liệu xuất hiện không thường xuyên. Tôi lưu trữ dữ liệu này trong hàng đợi và muốn gửi dữ liệu đến máy chủ trong nền không đồng bộ mà không làm chậm chuỗi giao diện người dùng chính. Mỗi đơn vị dữ liệu trong hàng đợi yêu cầu một yêu cầu GET. Hàng đợi phải được làm trống ngay cả khi ứng dụng đóng.

Thực tiễn tốt nhất để làm điều này là gì? Xin vui lòng gửi/hướng dẫn tôi đến mã/hướng dẫn.

Trả lời

27

các thực hành tốt nhất để làm điều này là gì?

Điều đó phụ thuộc vào "hiện tượng" này là gì và công việc này đang được thực hiện ở đâu.

Nếu "này" là "công việc không đồng bộ", bạn sẽ sử dụng đề trong dạng này hay thời trang:

  • Nếu hoạt động HTTP bạn đang lái xe một giao diện người dùng, bạn có thể sử dụng AsyncTask, vì vậy bạn có thể cập nhật UI một cách an toàn từ onPostExecute()

  • Nếu hoạt động HTTP của bạn là hoàn toàn ở chế độ nền, và bạn muốn làm cùng một lúc, sử dụng một IntentService, trong đó có sợi nền riêng của mình và hàng đợi công việc

  • Nếu hoạt động HTTP của bạn hoàn toàn ở chế độ nền và bạn muốn làm một lúc và bạn lo lắng về việc đảm bảo thiết bị vẫn tỉnh táo trong khi tất cả điều này đang diễn ra, hãy xem xét WakefulIntentService

  • Nếu Các hoạt động HTTP hoàn toàn nằm ở chế độ nền, nhưng bạn cảm thấy rằng bạn muốn thực hiện nhiều lần tại một thời điểm, cuộn Service của riêng bạn sử dụng Executor với nhóm chủ đề của riêng bạn, đảm bảo rằng bạn tắt dịch vụ đó khi công việc được thực hiện (như IntentService không) và đảm bảo rằng thiết bị vẫn thức với WakeLock (và có thể là WifiLock)

  • Vv

Nếu "này" là "HTTP GET" yêu cầu, sử dụng:

  • HttpUrlConnection, hoặc

  • HttpClient, hoặc

  • OkHttp (wrapper xung quanh những người có thêm lợi ích) hoặc

  • Retrofit (nếu yêu cầu GET của bạn là thực sự cuộc gọi dịch vụ Web), hoặc

  • Volley (nếu bạn thích mã HTTP wrapper của bạn sẽ được cung cấp tài liệu, không được hỗ trợ, nhưng googly)

  • Bất kỳ số lượng của bên thứ ba khác wrapper thư viện

Nếu "này" là "hàng đợi", sử dụng lớp Queue, hoặc LinkedBlockingQueue nếu bạn có kế hoạch có nhiều chủ đề làm việc với nó cùng một lúc.

Nếu "cái này" là cái gì khác, tôi không thể giúp bạn, vì tôi mệt mỏi vì đoán.

+1

+1 cho nhận xét của Volley. ;-) –

+0

Lưu ý: Volley bây giờ là cả hai thực hành tốt nhất được đề nghị, hỗ trợ, tài liệu và không chỉ áp dụng cho các yêu cầu GET. – Nilzor

+0

@Nilzor: "thực hành tốt nhất được đề xuất" - vui lòng cung cấp liên kết đến các trang trên http://developer.android.com cho biết điều này. "được hỗ trợ, được ghi lại" - vui lòng cung cấp liên kết đến một số trang web (ví dụ: GitHub repo) nơi hỗ trợ đang diễn ra và tài liệu nằm ở đó. "không chỉ áp dụng cho các yêu cầu GET" - Tôi chưa bao giờ nói rằng đó là * chỉ * cho các yêu cầu 'GET'. Câu hỏi * là về các yêu cầu 'GET'. – CommonsWare

8

Bạn có thể thực hiện cuộc gọi HTTP GET không đồng bộ của riêng mình bằng cách sử dụng AsyncTask nhưng tôi khuyên bạn nên chống lại nó trừ khi bạn đang thực hiện nó từ quan điểm học tập. Nếu bạn muốn có một giải pháp tốt đẹp, sạch sẽ và ổn định, tôi khuyên bạn nên sử dụng thư viện bên thứ 3 nổi tiếng Android Asynchronous Http Client. Từ trang web:

"Trình khách Http dựa trên gọi lại không đồng bộ cho Android được xây dựng trên các thư viện HttpClient của Apache. Tất cả các yêu cầu được thực hiện bên ngoài luồng giao diện người dùng chính của ứng dụng, nhưng bất kỳ logic gọi lại nào sẽ được thực hiện trên cùng một luồng cuộc gọi lại đã được tạo bằng cách sử dụng tính năng Thông báo xử lý của Android. "

Làm một GET là dễ dàng như:

AsyncHttpClient client = new AsyncHttpClient(); 
client.get("http://www.google.com", new AsyncHttpResponseHandler() { 
    @Override 
    public void onSuccess(String response) { 
     System.out.println(response); 
    } 
}); 
+0

Điều gì xảy ra nếu ứng dụng đóng? – ask

+0

Tôi nghĩ rằng yêu cầu async hiện tại sẽ kết thúc, nhưng tôi thực sự không chắc chắn. – britzl

+0

Thư viện đẹp. Gona thử nó trong dự án mới của tôi. Cảm ơn – speedynomads