2016-09-19 31 views
0

我正在開發一個Android應用程序,並希望使用Dagger作爲我的DI框架。但我不知道如何注入使用回調的依賴關係。如何使用依賴注入與java回調

比如我想要得到的位置,我用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); 
    } 
} 

在這種情況下,我想用匕首可以嘲笑它在我的測試中注入GoogleApiClient例如,但因爲它取決於這個班級,我不能。該場景對於任何使用回調的長時間運行操作都是有效的,即使我使用其他類來實現回調。

有沒有人知道這個解決方案?

回答

0

您需要爲接口編寫一個實現類讓我們稱之爲「ILocationRequesterImpl」,然後編寫一個方法來提供該impl的一個實例。例如你的模塊中:

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

另一種方法是使用構造函數注入在ILocationRequesterImpl類象下面這樣:

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

,然後這時候你的模塊中簡單地寫:

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