介绍
前面介绍了Dagger2,今天尝试自己的想法去应用了下,说实话很别扭,晚上睡觉思前想后这个的好处。总是有一种似懂非懂,感觉就是,让对象与对象之间产生了一中关联,多个module的provides(供给)的对象,通过1个Component联系起来,我尝试写了2个Demo,一个用了Dagger2,一个没有用,好处自己总结吧
MVP通过一个登陆Demo讲解
- LoginAcitivity,view层,实现LoginContract.LoginMvpView接口(MVP中的Presenter通过接口形式调用view层)
- LoginModule,Module层,提供了一个LoginApi的请求方法,返回LoginApi
- LoginPresenter,Presenter层,继承LoginContract.LoginBasePresenter,内部通过login方法
MVP优点
- 解耦View和Module(Activity再也不那么臃肿了)
- 逻辑清晰,阅读代码只需要更具指定规则进行阅读(乱写的)
- 其它自行体会
来个MVC和MVP图
项目结构
- inject包所有的Dagger2的注入类
- ApiModule类提供网络请求的提供的类,提供Retrofit
- AppMoudle类通过Context和单利Toast
- scope包自定义的scope
- Api包放所有模块对应的Http请求
- Contract包,mvp对用模块的view和presenter协议
开发逻辑
1:定义Application
public class App extends Application { private static Application app; public static AppComponent appComponent; @Override public void onCreate() { super.onCreate(); app=this; //初始化全局AppComponent,主要对module里面单利和app处于一个生命周期 appComponent = DaggerAppComponent.create(); } public static Application getApplication(){ return app; } public static Context getAppContext(){ return app.getApplicationContext(); } }
2:AppComponent对应2个module
AppModule提供Context和Appcation,ApiModule提供网络请求Retrofit(单利)
@Singleton @Component(modules = {AppModule.class, ApiModule.class}) public interface AppComponent { Context getContext(); Application getApplication(); Retrofit getRetrofit(); Toast getToast(); }
/** * 访问网络的Module */ @Module @Singleton public class ApiModule { public static final String BASE_URL = "https://www.iqshw.com/"; @Provides public Interceptor providesIntercepter() { return new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); String chainControl = request.cacheControl().toString(); if (TextUtils.isEmpty(chainControl)) { chainControl = "public, max-age=60, max-stale=240000";