2016-09-19 16 views
0

私はAndroidアプリケーションを開発しており、DaggerをDIフレームワークとして使用したいと考えています。しかし、コールバックを使用する依存関係を注入する方法はわかりません。Javaコールバックで依存関係注入を使用する方法

私は場所を取得したいと私は、このためにGoogleApiClientを使用たとえば

:私は私のテストでそれを模擬することができるようにダガーを使用してGoogleApiClientインスタンスを注入したいと思います。この場合

public class LocationProvider implements ILocationProvider, 
            GoogleApiClient.ConnectionCallbacks, 
            GoogleApiClient.OnConnectionFailedListener { 
    private GoogleApiClient googleApiClient; 
    private ILocationRequester requester; 

    public LocationProvider(@NonNull Context context, @NonNull ILocationRequester requester) { 
     this.requester = requester; 

     googleApiClient = new GoogleApiClient.Builder(context) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    } 

    @Override 
    public void beginGetLocation() { 
     googleApiClient.connect(); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 
     requester.locationFound(lastLocation); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     requester.locationFound(null); 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     requester.locationFound(null); 
    } 
} 

、しかし、このクラスに依存するので、私はできません。このシナリオは、コールバックを実装するために別のクラスを使用する場合でも、コールバックを使用する長時間実行される操作に対して有効です。

誰にも解決策がありますか?

答えて

0

インターフェイスの実装クラスを記述し、それを "ILocationRequesterImpl"と呼び、そのimplのインスタンスを提供するメソッドを記述する必要があります。お使いのモジュールで、たとえば:単純に書き込み、その後

public class ILocationRequesterImpl implements ILocationRequester { 
@Inject 
public ILocationRequesterImpl() { 
} ... ... 

とあなたのモジュールでこの時間:

@Provides 
public ILocationRequester provideLocationRequester(ILocationRequesterImpl lr) { 
    return lr; 
} 

@Provides 
public ILocationRequester provideLocationRequester() { 
    ILocationRequesterImpl lr=new ILocationRequesterImpl(); 
    return lr; 
} 

別の方法は、以下のようなILocationRequesterImplクラスのコンストラクタ・インジェクションを使用することです

関連する問題