Dagger2, Retrofit和MVP设计模式案例分析
了解Dagger2,Retrofit和MVP设计模式初始文献 本文主要针对上面两个文献再接再厉 @Provides
@ActivityScope
MainActivity provideMainActivity(){
return mainActivity;
}
其中ActivityScope是自己定义的 @Scope
public @interface ActivityScope {
}
@ActivityScope
@Component(modules = MainActivityModule.class,dependencies = AppComponent.class)
public interface MainActivityComponent{
MainActivity inject(MainActivity mainActivity);
MainActivityPresenter presenter();
}
上面是个接口MainActivityComponent,最后会生成DaggerMainActivityComponent.class,然后在MainActivity被调用,可以看到这里@component()中的参数是builder中的参数并且需要传入。其中inject是上面component定义的方法。 DaggerMainActivityComponent.builder()
.appComponent(appComponent)
.mainActivityModule(new MainActivityModule(this))
.build()
.inject(this)
可以查看DaggerMainActivityComponent生成的内容在参考链接1有描述了。
public interface ApiService {
@GET("/users")
public void getUsers(Callback<List<User>> callback);
}
在retrofit中定义如下, @Target(METHOD) 元注解即不能再被注解,用ElementType中定义的枚举来说明当前定义的是什么 @Retention 元注解,用RetentionPolicy定义的SOURCE(仅保留在class),CLASS(保留在class和dex),RUNTIME(放在dex,运行时也会读取)表明该注解在什么时候被使用。 String value() 定义了变量为value,可以认为是传入的参数“/users”,这个是在自定义Annotation里面定义的格式。 @RestMethod(“GET”) 是这个GET的注解,具体见后面。 /** Make a GET request to a REST path relative to base URL. */
@Documented
@Target(METHOD)
@Retention(RUNTIME)
@RestMethod("GET")
public @interface GET {
String value();
}
RestMethod的注解,value是传入的”GET”,boolean变量hasBody默认值是false. @Documented
@Target(ANNOTATION_TYPE)
@Retention(RUNTIME)
public @interface RestMethod {
String value();
boolean hasBody() default false;
}
Retrofit的使用
@Provides
@Singleton
RestAdapter provideRestAdapter(Application application,OkHttpClient okHttpClient){
RestAdapter.Builder builder = new RestAdapter.Builder();
builder.setClient(new OkClient(okHttpClient))
.setEndpoint(ENDPOINT);
return builder.build();
}
在生成好接口后就需要去生成那个具体的实例类如下 @Provides
@Singleton
ApiService provideApiService(RestAdapter restAdapter){
return restAdapter.create(ApiService.class);
}
了解了上面的注释后,需要集中注意在MVP模式下
public class MainActivity extends BaseActivity {
@InjectView(R.id.tv)
TextView textView;
@Inject
MainActivityPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
presenter.showUserName();
}
@Override
protected void setupActivityComponent(AppComponent appComponent) {
DaggerMainActivityComponent.builder()
.appComponent(appComponent)
.mainActivityModule(new MainActivityModule(this))
.build()
.inject(this);
}
public void setTextView(String username){
textView.setText(username);
}
}
但是这里presenter里面调用了MainActivity里面的方法,因为那个textView等UI的更新只能在View层进行,所以presenter里面有MainActivity的实例化。这就是在上面MainActivity里面需要等待这个presenter准备好。 public class MainActivityPresenter {
private MainActivity mainActivity;
private User user;
public MainActivityPresenter(MainActivity mainActivity,User user) {
this.mainActivity = mainActivity;
this.user = user;
}
public void showUserName(){
mainActivity.setTextView(user.getName());
}
}
总结在上面的方法中,分析下来感觉用到的模块比较多,用到了注释的知识,还有retrofit的网络知识获取,还讲到了MVP。 比较重要的应该是Dagger2的注释了,这个可以重点关注下。 MVP这个结构没有MVC清楚,后面还需要更进一步讨论。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |