这些工具的使用入门门槛还是挺高的,属于架构设计层次。所以边学习边记录一些学习过程的知识。其中涉及大量转载知识点。下面内容可能能帮助你入门。
MVP+Dagger2 + Kotlin
MVP
不是重点,了解即可。业务实现分别通过Mode
l、View
和Presenter
来承载。Model
可以看成是模块的业务逻辑和数据的提供者;View
专门负责数据可视化的呈现,和用户交互事件的相对应。一般地,View
会实现一个相应的接口;Presenter
是一般充当Model
和View
的纽带。
以Android为例子,View
通常为Activity/Fragment
,Model
比如简单业务UI更新等等,Presenter
负责联系两者。
// MVP中的V层 视图UI
public class MainActivity extends Activity implements IUpdate {
private Presenter mPresenter;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化presenter 将update接口对象传递给presenter
mPresenter= new Presenter (this);
//调用Presenter方法加载数据
mPresenter.loadData();
...
}
@Override
public void updateUI(String data) {
Log.d(TAG,"需要更新UI的数据:" + data);
}
}
//MVP中的P层 交互表现层
public class Presenter {
//业务接口
private IUpdate mIUpdate;
Presenter (IUpdate update) {
mIUpdate = update;
}
public void loadData() {
//调用model层方法,加载数据
...
//回调方法成功时
mIUpdate.updateUI(new Model().getText());
}
}
public interface IUpdate {
void updateUI(String data);
}
//MVP中的M层 业务实现层
public class Model {
public String getText(){
return "测试业务接口数据";
}
}
如此实现了:
- View与Model完全隔离
- Presenter与View的具体实现技术无关,只涉及依赖接口
但是这样仅仅只是业务上的解耦。观察发现,构造函数创造实例时,仍旧是直接的耦合,例如Presenter
构造需要修改,则需要动Activity
及Presenter
代码。当然不是说使用Dagger2完全不用改Activity
及Presenter
代码,而是从设计的角度去进行相应的变化以及简化。所以我们来看看Dagger2使用后有什么优势。
Dagger2
官方文档 https://dagger.dev/dev-guide/
Google Dagger github
Dagger2 是一个依赖注入框架,具备解耦的特性。通常是对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。(转自wiki,可以查看中的描述wiki)
引入插件和依赖
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:xx"
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
implementation 'com.google.dagger:dagger:2.xx'
kapt 'com.google.dagger:dagger-compiler:2.xx'
Dagger2结构简单描述
调用方的最常规的调用方式方法,假设定义了一个SimpleModule
,需要使用其中提供的方法。那么builder然后调用该方法simpleModule
DaggerSimpleComponent.builder()
.simpleModule(new SimpleModule(this))
.build()
.inject(this);
最常规的例子:构造传参数实现
public class MainActivity extends Activity implements IUpdate {
@Inject
Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Dagger2常用构造传参实现
DaggerMainComponent.builder().uIModule(new UIModule(this)).build().inject(this);
Button button = ...
button.setOnclickListener(){
@Override
public void onClick(View view){
mPresenter.loadData();
}
}
}
@Override
public void updateUI(String data) {
Log.d(TAG,"需要更新UI的数据:" + data);
Text view = .