MvpDaggerArch架构使用文档

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_23081779/article/details/96143754

简要说明

MvpDaggerArch是基于google官方推荐的MVP+dagger开发模式、同时集成了retrofit+rxJava2、greenDao、MMKV等,设计的一套可用于中小型项目的完整解决方案,可用于android初学者学习架构、android开发者直接基于此架构进行开发。

github地址

使用文档

一、下载

  1. 先从github中下载该代码
  2. 使编译通过并能够运行
  3. 修改包名,可能会需要全局替换为自己的包名(实际自己项目使用时,才需要这一步)
  4. 使编译通过并能够运行

二、新增页面

  1. 如果我们要新增一个页面,要至少新增对应的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);
}
  1. 配置该页面
  • 在manifest文件中增加该activity
  • ActivityBindingModule增加该activity
@Module
public abstract class ActivityBindingModule {
    @ActivityScoped
    @ContributesAndroidInjector(modules = LoginModule.class)
    abstract LoginActivity loginActivity();
}

三、数据层的使用

i.本地数据层的使用

  1. 先在接口LocalDataSource中定义抽象方法
void saveUser(User user);
  1. 在实现类LocalDataSourceImpl中实现该方法
@Override
public void saveUser(User user) {
       ConfigDataEngine.putObject(ConfigDataKeyEnum.USER_INFO.getKey(),user);
}
  1. 在代理类DataRepository中实现该方法
@Override
public void saveUser(User user) {
      localDataSource.saveUser(user);
}
  1. 在prensenter中直接使用
model.saveUser(user);

ii.网络数据层的使用

  1. 在ApiService中增加接口配置信息
@POST(BASE_URL+"user/login")
    @FormUrlEncoded
    Observable<HttpRespResult<User>> login(@Field("username")String username, @Field("password")String password);
  1. 在接口HttpDataSource中定接口
Observable<HttpRespResult<User>> login(String username, String pwd);
  1. 在HttpDataSourceImpl中实现接口
public Observable<HttpRespResult<User>> login(String username, String pwd){
        return apiService.login(username,pwd);
    }
  1. 在代理类DataRepository中实现该方法
@Override
    public Observable<HttpRespResult<User>> login(String username, String pwd) {
        return httpDataSource.login(username,pwd);
    }
  1. 在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稍微有所差别,此处介绍一下。

  1. startActivity时putExtra,此处和系统无差别
startActivity(
                        new Intent(mActivity,WebActivity.class)
                                .putExtra("url","www.baidu.com")
                );
  1. 在主fragment中接受值
String url=getArguments().getString("url");

猜你喜欢

转载自blog.csdn.net/qq_23081779/article/details/96143754