injectMVP
项目背景
依赖注入或者控制反转思想已经体现在了java web的spring框架中,在android中有关注入的开源项目主要有Dagger2,还有Arouter,但arouter不是专门去做注入的工作,暂不比较.Dagger2比较优秀。在android中MVP是最合适使用依赖注入的场景。但Dagger2有一个缺点,就是比较繁琐,这个框架就是简化这个过程,达到轻量级的效果。
Compare
Dragger2的使用demo
需要一个module 类,一个Component接口配合,简化的代码如下;
@Module
public class MainModule {
private IView mIView;
public MainModule(IView IView) {
mIView = IView;
}
@Provides
@ActivityScope
public IView provideIView(){
return this.mIView;
}
}
@ActivityScope
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainActivity activity);
}
public class MainActivity extends AppCompatActivity implements IView{
@Inject
MainPresenter mMainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponent
.builder()
.mainModule(new MainModule(this))
.build()
.inject(this);
mMainPresenter.loadData();
}
@Override
public void loadSucc() {
}
}
从代码层面来说,为了注入一个MainPersenter,要写这么多代码,有种不如不用的感觉,甚至在注入的时候出现new MainModule(this)这样的代码,按照道理这个过程应该交由容器来解决,不该暴露该用户的.
injectMvp的demo
无需配合类,一行代码实现注入过程,面向接口,不面向具体。
public interface IPresenter {
public void loadData();
public void bindView(IView iView);
public void unBindView();
}
@Compont(version = 1)
public class MainPresenter2 implements IPresenter {
private IView mIView;
@Override
public void bindView(IView iView) {
mIView = iView;
}
@Override
public void unBindView() {
mIView = null;
}
@Override
public void loadData() {
mIView.loadSucc();
}
}
public class MainActivity extends AppCompatActivity implements IView{
@AutoWired
IPresenter mIPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InjectManager.getInstance().init(getApplication());//放入application中初始化即可
InjectManager.getInstance().inject(this);
mIPresenter.bindView(this);
mIPresenter.loadData();
}
@Override
public void loadSucc() {
}
}
小结一下
injectMVP的处理依赖注入达到注入效果,比较简洁,版本可追述,也遵循了面向接口的思想,但是还是有可提高的地方。下面是具体的介绍以及使用方法。
Configuration
- Adding maven url
allprojects {
repositories {
google()
jcenter()
mavenCentral()
maven {
url "https://jitpack.io"
}
maven { url 'https://dl.bintray.com/josehan1989/maven' }
}
}
-
Adding dependencies and configurations
dependencies { implementation 'com.ca.inject:api:1.0.2' annotationProcessor 'com.ca.inject:compile:1.0.2' implementation 'com.ca.inject:annotation:1.0.1' }
-
Add annotation
@Compont(version = 1) public class MvpPresenter implements IPresenter { ... }
-
初始化
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); InjectManager.getInstance().init(this); } }
Advanced usage
-
AutoWire a field
public class MvpActivity extends AppCompatActivity implements IView{ @AutoWired IPresenter mPresenter; TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mvp); InjectManager.getInstance().inject(this); mPresenter.bind(this); tv = findViewById(R.id.tv); mPresenter.getTitle(); } @Override public void refreshTitle(String title) { tv.setText(title); } @Override protected void onDestroy() { super.onDestroy(); mPresenter.unBind(); } }
More features
-
高版本会覆盖低版本,只要往注解定义version就可以。
@Compont(version = 2) public class MvpPresenter2 implements IPresenter { ... }
-
有一个情况特殊,就是高版本的实现是通过继承而不是实现接口的方式,就要额外增加一个KEY,显示指出根接口(后续定义key的返回时class类型,可以不用制定key,将更方便)
@Compont(version = 3,key = MvpPresenter3.KEY)
public class MvpPresenter3 extends MvpPresenter2 {
public static final String KEY = "com.hansj.lo.demo.IPresenter";
public MvpPresenter3(){
init();
}
@Override
public void getTitle() {
mIView.refreshTitle("nihaoma");
}
}
In the last
github url:injectMVP,有兴趣的朋友,加入这个项目吧,让这个项目成为Dagger2之外的第二个选择。