博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通俗易懂的dagger2-实战篇
阅读量:6910 次
发布时间:2019-06-27

本文共 5442 字,大约阅读时间需要 18 分钟。

前言

本篇是以 dagger2mvp 中的应用开发为例。如果还有不理解的,可以先看一下我之前发的或者先了解一下,当然也可以直接开干

项目结构

先看一下项目结构图:

结构图.png

  • 包结构从上到下依次
  • application
    放置项目Application基类,可以在onCreate()初始化一些全局实例。
  • contract
    mvp中担任链接viewmodel
  • di
    • component
      主要用于关联@Module标注的类和Activity及Fragment的子类。
    • module
      用于对外提供对象,一般可在@Module标注的类中添加自定义方法,方法标注@Provides,方法体中可用来做一些实例化操作等。
  • model
    mvp中的model,这里我是用来放实体类网络请求
  • presenter
    mvp中的presenter,为了方便我在里面进行了网络请求并回调数据到view
  • ui
    • view
      mvp中的view,放置通用的回调方法

实战

一般写dagger2我都是先写好module,先看看包 di -> module 中的代码:

前期准备

@Modulepublic class NetworkModule {    @Singleton    @Provides    public GankService provideGankService() {        OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();        //设置超时时间        httpClientBuilder.connectTimeout(15 * 1000, TimeUnit.MILLISECONDS);        httpClientBuilder.writeTimeout(15 * 1000, TimeUnit.MILLISECONDS);        httpClientBuilder.readTimeout(15 * 1000, TimeUnit.MILLISECONDS);        return new Retrofit                .Builder()                .client(httpClientBuilder.build())                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                .addConverterFactory(GsonConverterFactory.create())                .baseUrl(GankService.BASE_URL)                .build()                .create(GankService.class);    }}复制代码

比较简单,返回一个GankService接口对象,注意三个注解:

  • @Module
    用于对外提供对象,一般可在@Module标注的类中添加自定义方法,方法标注@Provides,方法体中可用来做一些实例化操作等。
  • @Provides
    配合@Module一起使用,@Provides用于标记方法,表示可以通过这个方法获取一个对象,一般用于自定义类中。
  • @Singleton
    dagger 2中的单例模式,@Module类中使用了,@Component中也要使用。

这里的NetworkModule类我只是用作一个依赖,我们可以在 AppComponent去引用它,在这之前再看看AppModule的代码:

@Modulepublic class AppModule {    private Application mApplication;    public AppModule(Application application) {        mApplication = application;    }    @Singleton    @Provides    public Application provideApplication() {        return mApplication;    }}复制代码

这里没有多大用处,只是在为了后期能在全局调用Application基类对象,最后看看AppComponent的代码:

@Singleton@Component(modules = {AppModule.class, NetworkModule.class})public interface AppComponent {    Application getApplition();    GankService getGankService();}复制代码
  • @Component
    主要用于关联@Module标注的类和Activity及Fragment的子类。

在Application基类App中调用

public class App extends Application {    private AppComponent mAppComponent;    private static App sApp;    @Override    public void onCreate() {        super.onCreate();        sApp = this;        mAppComponent = DaggerAppComponent.builder()                .appModule(new AppModule(this))                .networkModule(new NetworkModule())                .build();    }    public static App getApp() {        return sApp;    }    public AppComponent getAppComponent() {        return mAppComponent;    }}复制代码

在这之前记得先在as菜单栏中Build -> Rebuild Project,最后不要忘了在AndroidMainifest.xml application节点下加上基类android:name=".application.App"

如何在Activity or Fragment中调用呢

我写了一个gank.io测试用例,前面我直接贴代码:

contract -> GankContract

public interface GankContract {    interface View extends BaseView {        void loadGankList(List
list); } interface Presenter { void getGank(String type, int count, int page); }}复制代码

di -> GankModule

@Modulepublic class GankModule {    private GankContract.View mView;    public GankModule(GankContract.View view) {        mView = view;    }    @ActivityScope    @Provides    public GankContract.View provideView() {        return mView;    }}复制代码

@ActivityScope是我自定义的一个注解类

@Scopepublic @interface ActivityScope {}复制代码
  • @Scope
    Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。

注解类在kotlin中的写法:

@Scopeannotation class ActivityScope复制代码

di -> component

@Component(modules = {GankModule.class}, dependencies = {AppComponent.class})public interface GankComponent {    void inject(MainActivity mainActivity);}复制代码

dagger2具体代码就这么多了,应该算比较好理解的???

下面就是具体使用的代码了

MainActivity.class

public class MainActivity extends AppCompatActivity implements GankContract.View {    private static final String TAG = "MainActivity";    @Inject    GankPresenter mPresenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        DaggerGankComponent.builder()                .appComponent(App.getApp().getAppComponent())                .gankModule(new GankModule(this))                .build()                .inject(this);        mPresenter.getGank("Android", 10, 1);    }    @Override    public void loadGankList(List
list) { for (GankEntity entity : list) { Log.d(TAG, "loadGankList: " + entity.toString()); } }}复制代码

presenter -> GankPresenter

public class GankPresenter implements GankContract.Presenter {    private GankContract.View mView;    private GankService mGankService;    @Inject    public GankPresenter(GankContract.View view, GankService gankService) {        mView = view;        mGankService = gankService;    }    @Override    public void getGank(String type, int count, int page) {        mGankService.getGankList(type, count, page)                .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Consumer
>() { @Override public void accept(HttpResult
gankEntityHttpResult) throws Exception { mView.loadGankList(gankEntityHttpResult.getResults()); } }); }}复制代码

主要代码就这么多了,如果还有什么问题的话可以在下方留言,谢谢


不说了,RNG vs SKT 要开始了,首先恭喜RNG一波,溜了溜了

转载地址:http://yegdl.baihongyu.com/

你可能感兴趣的文章
详解openstack命令启动实现流程及原理(nova --debug image-list)
查看>>
Java-NIO-Buffer详解
查看>>
elasticsearch elk最全java api 搜索 聚合、嵌套查询
查看>>
关于spring中使用多个quatz配置文件配置计划任务时,只有其中一个文件的任务有效的问题...
查看>>
锁屏时禁止让activity自动onCreate和onDestroy
查看>>
大数据日志收集框架之Flume入门
查看>>
openssl生成RSA公私钥对
查看>>
android StringBuffer类的使用
查看>>
关于互联网+,工业互联网2025,互联网安全
查看>>
MyBatis构建sql
查看>>
hibernate配置文件 *.hbm.xml长时间加载不出来原因
查看>>
JSP基本语法
查看>>
如何实现phpcms v9_4X版本tag的伪静态?
查看>>
graphite-web render api
查看>>
如何更改Oracle字符集
查看>>
Linux常用命令
查看>>
邮件服务器树状通讯录实现智能化应用
查看>>
Nginx实现基于用户的访问控制(Ngx_http_auth_basic_module模块)
查看>>
android 类似QQ 换皮肤 实现思路 apk资源共享
查看>>
tp5配置https
查看>>