2016-03-15 18 views
5

Tôi muốn tiêm vào các cá thể của ứng dụng khách api của Google trong các phần khác nhau của dự án của tôi tuy nhiên tôi chưa quản lý để làm cho nó hoạt động.Tiêm của GoogleApiClient

@Provides @Named("geodata_api") 
    @Singleton 
    GoogleApiClient providesGoogleApiClient(Context context) { 
      return new GoogleApiClient.Builder(context) 
        .addApi(Places.GEO_DATA_API) 
        .build(); 
     } 

@Provides @Named("location_api") 
    @Singleton 
    GoogleApiClient providesGoogleApiClient(Context context) { 
     return new GoogleApiClient.Builder(providesContext()) 
       .addApi(LocationServices.API) 
       .build(); 
    } 
+0

Không có dấu hỏi "?", Bạn không đặt câu hỏi. Cần thêm chi tiết. những gì chính xác là thất bại và những gì chẩn đoán được đưa ra? –

+0

Câu hỏi tương tự đã được hỏi cách đây vài ngày: http://stackoverflow.com/q/35972868/1837367 –

+0

"tôi chưa quản lý để làm cho nó hoạt động" -> * Cái gì * không hoạt động? Bạn có thể đăng lỗi không? –

Trả lời

3

Vấn đề là Dagger sẽ không thể để cung cấp các callbacks, kể từ khi callbacks là chi tiết thực hiện, chứ không phải phụ thuộc - và callbacks thường được thiết lập trước khi xây dựng cho khách hàng (xem tùy chọn 2 bên dưới để biết thêm về các cuộc gọi lại).

Một lựa chọn sẽ có Dagger cung cấp GoogleApiClient.Builder, và sau đó thực hiện của bạn phải hoàn thành chuỗi bằng cách thiết lập callbacks và gọi build():

@Provides 
@Named("location_api") 
GoogleApiClient.Builder provideLocationClient(Context context) { 
    return new GoogleApiClient.Builder(context) 
      .addApi(LocationServices.API); 
} 

@Provides 
@Named("geodata_api") 
GoogleApiClient.Builder provideGeodataClient(Context context) { 
    return new GoogleApiClient.Builder(context) 
      .addApi(Places.GEO_DATA_API); 
} 

Lưu ý những thay đổi:

  1. @Named(..) là đã là một phạm vi, vì vậy bạn nên thả các @Singleton - nó không cần thiết.
  2. Hai phương pháp cung cấp dịch vụ cần phải được đặt tên khác nhau (provideLocationClient, provideGeodataClient)
  3. Thay vì trả lại GoogleApiClient, module được trả lại một GoogleApiClient.Builder.

Bây giờ sử dụng phụ thuộc đó, bạn sẽ bơm những người xây dựng, và sau đó đính kèm callbacks của bạn và xây dựng khách hàng:

@Inject @NamedScope("location_api") GoogleApiClient.Builder mLocationClientBuilder; 

... 

mComponent.inject(this); 
mClient = mLocationClientBuilder.<addCallbacks(...)>.build(); 
mClient.connect(); 

Khi chế giễu người xây dựng này sử dụng khuôn khổ kiểm tra đơn vị chế giễu của bạn, có một điều bạn' ll phải làm là giữ một tham chiếu đến gọi lại, và gọi phương thức gọi lại onConnected(Bundle) khi connect() được gọi.


Một lựa chọn khác là cung cấp cho GoogleApiClient như bạn được, nhưng sau đó bạn cần phải nhớ để đăng ký callbacks của bạn trước khi kết nối, và bạn phải nhớ để unregister những callbacks khi bạn đã hoàn tất (để ngăn chặn một ký ức rò rỉ). Xem GoogleApiClient#registerConnectionCallbacks()

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