2016-08-03 13 views
13

Tôi đến từ nền iOS và tôi mới sử dụng Android.Tương đương với Android của iOS GCD dispatch_group API

Có cách nào hiệu quả và nhanh chóng để thực hiện cùng một cuộc gọi API mạng nhưng với các thông số khác nhau mỗi khi các thông số được lưu trữ trong một mảng. Tôi chỉ muốn quay trở lại khi tất cả các cuộc gọi API mạng đã hoàn thành, nhưng tôi không muốn bất kỳ cuộc gọi api nào trong vòng lặp chặn các cuộc gọi api khác trong vòng lặp.

Tôi về cơ bản muốn tương đương với mã Swift này. Về cơ bản, chức năng dưới đây sẽ không trở lại cho đến khi tất cả các cuộc gọi mạng getData có thành công hoặc không thành công. Làm cách nào để tôi thực hiện điều tương tự bên dưới trong Android?

func getDataForParameters(array: NSArray) { 
    let group = dispatch_group_create() 
    for (var i = 0; i < array!.count(); i++) { 
     let param = array![i] 
     dispatch_group_enter(group) 

     getData(param, success: { 
      () in 
      dispatch_group_leave(group) 

      }, failure: { 
       () in 
       dispatch_group_leave(group) 
     }) 
    } 
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER) 
} 
+0

bạn có thể sử dụng ExecutorService để thực hiện một số tác vụ mà không chặn các cuộc gọi mạng khác – has19

Trả lời

4

Bạn có nhiều cách để đạt được điều này.

  1. Bạn có thể sử dụng Thread.join() trong trường hợp bạn đang sử dụng đề
  2. bạn có thể sử dụng thư viện của bên thứ 3 như RxJava.
  3. bạn có thể viết điều phối sự kiện riêng của bạn ở đây là một xấu xí example
  4. answer này cũng bao gồm câu hỏi của bạn CallableFuture
+1

Tất cả sẽ hoạt động, nhưng RxJava là, IMHO, tốt nhất trong số 4 đề xuất này – GreyBeardedGeek

1

Nếu các cuộc gọi mạng trong vòng lặp không nên chặn cuộc gọi mạng khác thì bạn nên thực hiện cuộc gọi mạng không đồng bộ.

Bạn có thể sử dụng thư viện mạng chuyền của google để thực hiện cuộc gọi mạng và thực thi không đồng bộ. Đi theo liên kết bên dưới để xem số

https://developer.android.com/training/volley/index.html.

nếu bạn có thể thực hiện bộ đếm tăng hoặc thành công hoặc thất bại gọi lại, bạn có thể sử dụng biến đó để xác định whento quay trở lại phương thức gọi của bạn.

Vì các cuộc gọi mạng được thực hiện không đồng bộ, bạn cần phải viết giao diện gọi lại sẽ được kích hoạt sau khi điều kiện bộ đếm của bạn được đáp ứng để nó sẽ gửi gọi lại đến phương thức được gọi. bạn có thể tìm thấy nhiều ví dụ về cách sử dụng cơ chế gọi lại trong Android. Chức năng gọi lại giống như chức năng Delegate trong IOS.

Tôi hy vọng điều này sẽ hữu ích.

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