版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
简要说明
MvpDaggerArch是基于google官方推荐的MVP+dagger开发模式、同时集成了retrofit+rxJava2、greenDao、MMKV等,设计的一套可用于中小型项目的完整解决方案,可用于android初学者学习架构、android开发者直接基于此架构进行开发。
github地址
使用文档
一、下载
- 先从github中下载该代码
- 使编译通过并能够运行
- 修改包名,可能会需要全局替换为自己的包名(实际自己项目使用时,才需要这一步)
- 使编译通过并能够运行
二、新增页面
- 如果我们要新增一个页面,要至少新增对应的6个文件,fragment_xxx.xml、XxxContract.java、XxxFragment.java、XxxPresenter.java、XxxActivity.java、XxxModule.java
- fragment_xxx.xml是该页面的xml静态文件,此处不再赘述
- XxxContract是view层和presenter层的接口层
- XxxFragment是该页面的主fragment,也是view的实现层
- XxxPresenter是mvp中的presenter层,XxxContract中presenter接口的实现层
- XxxModule是定义注入类型的
//LoginContract.java
public abstract class LoginContract {
interface View extends BaseView<Presenter> {
}
interface Presenter extends BasePresenter<View> {
}
}
//LoginFragment.java,ActivityScoped一定不能少
@ActivityScoped
public class LoginFragment extends BaseFragment<LoginContract.Presenter> implements LoginContract.View{
@Inject
public LoginFragment() { //该注入方法不能少,不然会报错
}
@Override
protected int getContentViewResId() {
return R.layout.fragment_login;
}
@Override
protected BaseView getBaseView() {
return this; //注意此处一定要返回this
}
}
//LoginPresenter.java
@ActivityScoped
public class LoginPresenter extends AbsPresenter<LoginContract.View> implements LoginContract.Presenter{
@Inject
public LoginPresenter() {
}
}
//LoginActivity.java
public class LoginActivity extends ContainerActivity {
@Inject
LoginFragment loginFragment;
@Inject
LoginContract.Presenter loginPresenter;
@Override
protected void init() {
initOne(loginFragment,loginPresenter);
}
}
//LoginModule.java
@Module
public abstract class LoginModule {
@FragmentScoped
@ContributesAndroidInjector
abstract LoginFragment loginFragment();
@ActivityScoped
@Binds
abstract LoginContract.Presenter loginPresenter(LoginPresenter presenter);
}
- 配置该页面
- 在manifest文件中增加该activity
- ActivityBindingModule增加该activity
@Module
public abstract class ActivityBindingModule {
@ActivityScoped
@ContributesAndroidInjector(modules = LoginModule.class)
abstract LoginActivity loginActivity();
}
三、数据层的使用
i.本地数据层的使用
- 先在接口LocalDataSource中定义抽象方法
void saveUser(User user);
- 在实现类LocalDataSourceImpl中实现该方法
@Override
public void saveUser(User user) {
ConfigDataEngine.putObject(ConfigDataKeyEnum.USER_INFO.getKey(),user);
}
- 在代理类DataRepository中实现该方法
@Override
public void saveUser(User user) {
localDataSource.saveUser(user);
}
- 在prensenter中直接使用
model.saveUser(user);
ii.网络数据层的使用
- 在ApiService中增加接口配置信息
@POST(BASE_URL+"user/login")
@FormUrlEncoded
Observable<HttpRespResult<User>> login(@Field("username")String username, @Field("password")String password);
- 在接口HttpDataSource中定接口
Observable<HttpRespResult<User>> login(String username, String pwd);
- 在HttpDataSourceImpl中实现接口
public Observable<HttpRespResult<User>> login(String username, String pwd){
return apiService.login(username,pwd);
}
- 在代理类DataRepository中实现该方法
@Override
public Observable<HttpRespResult<User>> login(String username, String pwd) {
return httpDataSource.login(username,pwd);
}
- 在prensenter中直接使用
model.login(username,pwd)
.compose(SchedulerTransformer.transformer())
.compose(new DialogTransformer(mActivity).transformer())
.subscribe(new CommonObserver<HttpRespResult<User>>() {
@Override
public void onSuccess(HttpRespResult<User> userHttpRespResult) {
}
});
四、页面传值
页面传值可采用两种方式,一是兼容系统的putExtra,二是使用EventBus(可以看一下粘性传值postSticky方法),EventBus使用很多,此时不再赘述,putExtra稍微有所差别,此处介绍一下。
- startActivity时putExtra,此处和系统无差别
startActivity(
new Intent(mActivity,WebActivity.class)
.putExtra("url","www.baidu.com")
);
- 在主fragment中接受值
String url=getArguments().getString("url");