Dagger2:如何在 Presenter 中注入改造模块 class
Dagger2: how to inject retrofit module in presenter class
Dagger2学习还是有难度,正在努力学习中。使用新匕首 android 设置项目以避免在 activity class 内部注入。到目前为止它正在工作,但需要使用在演示者 class 中注入的改造。在 AppComponent 中添加了改装模块,但 apiService class 方法在从演示者 class 调用时变为 null。需要知道如何正确注射。
AppComponent.java
@Singleton
@Component(modules = {
/* Use AndroidInjectionModule.class if you're not using support library */
AndroidSupportInjectionModule.class,
AppModule.class,
BuildersModule.class,
RetrofitModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(BaseApplication application);
Builder retrofitModule(RetrofitModule retrofitModule);
AppComponent build();
}
void inject(BaseApplication app);
}
AppModule.java
@Module
class AppModule {
@Provides
Context provideContext(BaseApplication application) {
return application.getApplicationContext();
}
}
BuildersModule.java
@Module
public abstract class BuildersModule {
@ContributesAndroidInjector(modules = {SplashViewModule.class, SplashModule.class})
abstract SplashActivity bindSplashActivity();
// Add bindings for other sub-components here
}
BaseApplication.java
public class BaseApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
//configure timber for logging
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
}
DaggerAppComponent
.builder()
.application(this)
.retrofitModule(new RetrofitModule())
.build()
.inject(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
RetrofitModule.java
@Module
public class RetrofitModule {
//get retrofit instance
@Singleton
@Provides
public UserAuthService getRestService() {
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiConstants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(getOkHttpClient())
.build();
return retrofit.create(UserAuthService.class);
}
}
UserAuthService.java
public interface UserAuthService {
@GET("v2/5be345062f00006b00ca22c4")
Observable<Example> getExampleResponse();
}
SplashModule.java
@Module
public class SplashModule {
@Provides
SplashPresenter provideSplashPresenter(SplashView splashView) {
return new SplashPresenter(splashView);
}
}
SplashViewModule.java
@Module
public abstract class SplashViewModule {
@Binds
abstract SplashView provideSplashView(SplashActivity splashActivity);
}
SplashPresenter.java
class SplashPresenter extends BasePresenter<SplashView> {
@Inject
@Named(ValueConstants.MAIN_THREAD)
Scheduler mMainThread;
@Inject
@Named(ValueConstants.NEW_THREAD)
Scheduler mNewThread;
@Inject
UserAuthService userAuthService;
SplashPresenter(SplashView view) {
super(view);
}
//test purpose
public void sayHello() {
userAuthService.getExampleResponse()
.observeOn(mMainThread)
.subscribeOn(mNewThread)
.subscribe(new Observer<Example>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Example example) {
Timber.d("example %s", example.toString());
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
}
});
}
}
此处 "userAuthService.getExampleResponse()" 为空。我认为演示者需要了解 RetrofitModule 注入。所以我需要解决这个问题以及如何解决?
我会将这些依赖项添加到 SplashPresenter
的构造函数中,并向其添加 @Inject
注释。 Dagger2 支持构造函数注入,你需要的所有依赖都是可解析的(你也可以去掉SplashModule
)
class SplashPresenter extends BasePresenter<SplashView> {
private Scheduler mMainThread;
private Scheduler mNewThread;
private UserAuthService userAuthService;
@Inject
SplashPresenter(SplashView view, UserAuthService userAuthService, @Named(ValueConstants.NEW_THREAD) Scheduler newThread, @Named(ValueConstants.MAIN_THREAD) Scheduler mainThread) {
super(view);
this.userAuthService = userAuthService;
mNewThread = newThread;
mMainThread = mainThread;
}
Dagger2学习还是有难度,正在努力学习中。使用新匕首 android 设置项目以避免在 activity class 内部注入。到目前为止它正在工作,但需要使用在演示者 class 中注入的改造。在 AppComponent 中添加了改装模块,但 apiService class 方法在从演示者 class 调用时变为 null。需要知道如何正确注射。
AppComponent.java
@Singleton
@Component(modules = {
/* Use AndroidInjectionModule.class if you're not using support library */
AndroidSupportInjectionModule.class,
AppModule.class,
BuildersModule.class,
RetrofitModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(BaseApplication application);
Builder retrofitModule(RetrofitModule retrofitModule);
AppComponent build();
}
void inject(BaseApplication app);
}
AppModule.java
@Module
class AppModule {
@Provides
Context provideContext(BaseApplication application) {
return application.getApplicationContext();
}
}
BuildersModule.java
@Module
public abstract class BuildersModule {
@ContributesAndroidInjector(modules = {SplashViewModule.class, SplashModule.class})
abstract SplashActivity bindSplashActivity();
// Add bindings for other sub-components here
}
BaseApplication.java
public class BaseApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
//configure timber for logging
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
}
DaggerAppComponent
.builder()
.application(this)
.retrofitModule(new RetrofitModule())
.build()
.inject(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
RetrofitModule.java
@Module
public class RetrofitModule {
//get retrofit instance
@Singleton
@Provides
public UserAuthService getRestService() {
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiConstants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(getOkHttpClient())
.build();
return retrofit.create(UserAuthService.class);
}
}
UserAuthService.java
public interface UserAuthService {
@GET("v2/5be345062f00006b00ca22c4")
Observable<Example> getExampleResponse();
}
SplashModule.java
@Module
public class SplashModule {
@Provides
SplashPresenter provideSplashPresenter(SplashView splashView) {
return new SplashPresenter(splashView);
}
}
SplashViewModule.java
@Module
public abstract class SplashViewModule {
@Binds
abstract SplashView provideSplashView(SplashActivity splashActivity);
}
SplashPresenter.java
class SplashPresenter extends BasePresenter<SplashView> {
@Inject
@Named(ValueConstants.MAIN_THREAD)
Scheduler mMainThread;
@Inject
@Named(ValueConstants.NEW_THREAD)
Scheduler mNewThread;
@Inject
UserAuthService userAuthService;
SplashPresenter(SplashView view) {
super(view);
}
//test purpose
public void sayHello() {
userAuthService.getExampleResponse()
.observeOn(mMainThread)
.subscribeOn(mNewThread)
.subscribe(new Observer<Example>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Example example) {
Timber.d("example %s", example.toString());
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
}
});
}
}
此处 "userAuthService.getExampleResponse()" 为空。我认为演示者需要了解 RetrofitModule 注入。所以我需要解决这个问题以及如何解决?
我会将这些依赖项添加到 SplashPresenter
的构造函数中,并向其添加 @Inject
注释。 Dagger2 支持构造函数注入,你需要的所有依赖都是可解析的(你也可以去掉SplashModule
)
class SplashPresenter extends BasePresenter<SplashView> {
private Scheduler mMainThread;
private Scheduler mNewThread;
private UserAuthService userAuthService;
@Inject
SplashPresenter(SplashView view, UserAuthService userAuthService, @Named(ValueConstants.NEW_THREAD) Scheduler newThread, @Named(ValueConstants.MAIN_THREAD) Scheduler mainThread) {
super(view);
this.userAuthService = userAuthService;
mNewThread = newThread;
mMainThread = mainThread;
}