详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之四

    前面我们分别将MVP和Dagger模块的构成,这篇我们说一下一些小细节以及最后总结一下。


    关于MVP这里就没什么好说的,一个很通俗易懂的设计架构,使用起来也很方便,应该对大家没什么难度,这里主要就说一下Dagger2的一些细节问题吧!


    可以看到我在该项目中使用了@Singleton标签,表示单例。又因为依赖与被依赖的@Scop不能相同,我又自定义了一个@SingleUserModel,这样就可以得到单例了吗?


    我们运行一下这个项目,看log信息(log的tag设置为“zyj”):

在第一个界面,点击LOGIN按钮,得到打印信息:

打印信息

点击NEXT进入下个页面,然后在点击DETAIL,得到打印信息:


再点击NEXT进入下个页面,再点击DETAIL,得到打印信息:


    可以发现,在第一个界面和第二个界面,使用的UserMode对象是同一个对象,在第三个界面所使用的是新对象,为什么?    来看代码吧!

    在MainComponent和SecondComponent中,我们都是承载于UserModelComponent类,UserModelComponent类里面使用了@Singleton,所以导致MainComponent和SecondComponent都需要使用新的标签,而在ThreeComponent中,我们承载的是NewUserModelComponent,它是没有添加@Singleton,所以得到的不是原来那个单例。


    细心的朋友可能发现了,打印信息里面的OkHttpClient和Retrofit也是同样的表现,我们可以看一下ModelModule类:

@Module
public class ModelModule {

    @Provides
    @Singleton
    OkHttpClient provideOkHttpClient() {
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(60 * 1000, TimeUnit.MILLISECONDS)
                .readTimeout(60 * 1000, TimeUnit.MILLISECONDS)
                .build();
        return client;
    }

    @Provides
    @Singleton
    Retrofit provideRetrofit(OkHttpClient client) {
        Retrofit retrofit = new Retrofit.Builder()
                .client(client)
                .baseUrl("http://www.baidu.com") // 这里替换为请求的基本url
                .build();
        return retrofit;
    }

}

    mOkHttpClient和mRetrofit都被打上了@Singleton标签,那为什么他们两个都不是单例呢?这和@Scope标签的作用域有关,我在网上看到一段话,对这个标签的描述很详细:

Scope的使用,如何实现单例?  
  
这个迷之Scope也是有点难以理解,我们在哪里使用到了Scope呢。在我们的AppComponent中添加了一个注解为@Singleton,@Singleton就是一个Scope,据说可以实现单例哟。。。难道这样就实现了单例模式?我刚刚开始是这样理解的。直到仔细的看了几遍这篇文章我才知道并不是这样的。  
  
事实上@Sinleton中并没有创建单例的能力,那么AppComponent中提供的依赖注入是如何实现单例的呢。其实这个原理很贱单。  
  
首先Module提供了创建实例的方法,接着AppComponent中对Module进行管理,最后AppComponent在自定义Applicaiton中被实例化了一次。  
  
这个实例化了一次是最重要的呀。仅仅被实例化了一次,那不就是单例么。就是这么简单呀。  
  
可能有些童靴当时就不乐意了,那既然这样都已经实现了单例,那么这个@Singltop还要来何用?不是多此一举吗。  
  
其实@Singletop还有有一些作用的,首先一方面能让你直面的了解到这是一个单例,其次这个@Singletop能够更好的管理Modlue和Component之间的关系。  
  
Dagger2需要保证Component和Module是匹配的,就需要用到这个注解。  

    项目的解析基本就到这里了。晒一下这个项目的整体照!



   (以下是我个人观点,不对勿喷)

    写代码写到后面,会发现“写代码”本就应该是一件艺术工作,如果去优雅的处理和电脑、手机、硬件之间的关系,是我们所追求的,我们应该使用最精炼的、最易懂的代码去解决工作难题,而不是违背大众的思维方式去独辟蹊径,就算最后你这样写了,在不容易理解的地方加上尽可能详尽的注释是非常有必要的。我之前就遇见过这种同事,总是以别人看不懂他的代码为傲,我实在不知道这有什么好的,别人看不懂,只能说明你这个方式有问题,大家是一个团队,不是一个人开发,代码可能需要大家相互去维护,所以,如果你这样做了,请以后善待代码,优雅的编程,优雅的工作!




源码下载

详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之一

详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之二

详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之三

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为你生成一个关于Android RxJava + Retrofit + MVP网络框架封装的完整项目配置的博客。以下是一个示例: 标题:Android RxJava + Retrofit + MVP网络框架封装:完整项目配置 正文: 在Android开发中,使用RxJava、Retrofit和MVP进行网络请求的框架封装是非常常见和实用的。本文将向你展示如何将它们结合起来,以实现一个完整的网络请求框架。 首先,确保你的Android项目中已经引入了RxJava、Retrofit和MVP的相关依赖库。在项目的build.gradle文件中添加以下依赖: ```groovy dependencies { // RxJava implementation 'io.reactivex.rxjava2:rxjava:2.2.21' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' // MVP implementation 'com.hannesdorfmann.mosby3:mvp:3.2.0' } ``` 接下来,我们将按照以下步骤完成完整的项目配置: 1. 创建网络请求接口 在你的项目中创建一个接口,用于定义网络请求的方法。例如,创建一个名为ApiService的接口,其中包含一个获取数据的方法。 ```java public interface ApiService { @GET("api/endpoint") Observable<ResponseData> getData(); } ``` 2. 创建网络请求管理类 创建一个名为ApiManager的类,用于管理网络请求。在这个类中,你可以初始化Retrofit,并提供一个方法来执行具体的网络请求。 ```java public class ApiManager { private static final String BASE_URL = "http://your-api-base-url.com/"; private ApiService apiService; public ApiManager() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); apiService = retrofit.create(ApiService.class); } public Observable<ResponseData> getData() { return apiService.getData() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } } ``` 3. 创建Presenter层 在MVP架构中,Presenter层负责处理业务逻辑和数据操作。创建一个名为MainPresenter的类,并在其中调用ApiManager执行网络请求。 ```java public class MainPresenter { private MainView mainView; private ApiManager apiManager; public MainPresenter(MainView mainView) { this.mainView = mainView; apiManager = new ApiManager(); } public void fetchData() { apiManager.getData() .subscribe(new Observer<ResponseData>() { @Override public void onSubscribe(Disposable d) { // 可选的订阅回调 } @Override public void onNext(ResponseData responseData) { // 处理请求成功的数据 mainView.showData(responseData); } @Override public void onError(Throwable e) { // 处理请求失败的情况 mainView.showError(e.getMessage()); } @Override public void onComplete() { // 请求完成,可选的回调 } }); } } ``` 4. 创建View层 在MVP架构中,View层负责展示数据和处理用户交互。创建一个名为MainActivity的类,并实现MainView接口。 ```java public class MainActivity extends AppCompatActivity implements MainView { private MainPresenter mainPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainPresenter = new MainPresenter(this); mainPresenter.fetchData(); } @Override public void showData(ResponseData responseData) { // 展示数据到UI上 } @Override public void showError(String errorMessage) { // 展示错误信息到UI上 } } ``` 通过以上步骤,你就完成了Android中使用RxJava、Retrofit和MVP进行网络请求的框架封装。根据你的实际需求,你可以进一步添加其他功能和模块来完善你的项目。 希望本文对你有所帮助!如果有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值