一个好用的MVP架构,使用者无需关心mvp的具体实现,简单继承几个类即可实现,另外还 包含一个支持Fragment懒加载的BaseFragment。
·支持普通的mvc架构开发,简单封装了BaseActivity,使用时继承即可。 ·支持基于MVP模式的开发,使用时只需继承BaseMapActivity即可。 ·简单封装了Fragment,继承BaseFragment即可,默认不开启懒加载,需要时手动开启。 ·对Fragment对MVP的支持,继承BaseMvpFragment即可 ·从3.0版本开始支持androidx
如何使用:
compile 'com.jzw:mvpbase:2.0'
Androidx支持 compile 'com.jzw:mvpbase:3.0'
1.普通使用方式 :继承BaseActivity
public class MainActivity extends BaseActivity {
@Override
public int getLayoutId() {
return R.layout.activity_main;
}
@Override
public void initView(Bundle savedInstanceState) {
findViewById(R.id.btn_mvp).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(LoginActivity.class);
}
});
findViewById(R.id.btn_frgment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(LazyFragmentActivity.class);
}
});
}
}
2.MVP模式:继承BaseMvpActivity
public class LoginActivity extends BaseMvpActivity<ILoginView, LoginPresenter> implements ILoginView {
@Override
public int getLayoutId() {
return R.layout.act_login;
}
@Override
public void initView(Bundle savedInstanceState) {
//初始化views
findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//登陆
presenter.login("jzw", "123456");
}
});
}
@Override
public void showLoadding() {
//在这里显示加载对话框
}
@Override
public void hideLoadding() {
//在这里隐藏对话框
}
@Override
public LoginPresenter initPresenter() {
//初始化presenter
return new LoginPresenter();
}
@Override
public void loginSuccess(String userid) {
//登陆成功回掉到这里,更新UI 显示数据
Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
}
}
继承时传入两个泛型,一个是View接口类型,一个presenter类,同时要实现View接口。上面的
代码我使用登陆做了一个演示,View接口为ILogingView,presenter为LoginPresenter。
其中view接口继承BaseView
public interface ILoginView extends BaseView {
//登陆成功后更新UI回掉方法
void loginSuccess(String userid);
}
其中presenter继承BasePresenter
public class LoginPresenter extends BasePresenter<ILoginView> {
private LoginModle modle;
@Override
public void init() {
modle = new LoginModle();
}
@Override
public void release() {
if (modle != null) {
modle = null;
}
}
//登陆方法,在这里使用model实现登陆逻辑
public void login(String user, String pwd) {
getMvpView().showLoadding();
modle.loginUser(user, pwd);
getMvpView().loginSuccess(user);
getMvpView().hideLoadding();
}
}
modle集成BaseModle
public class LoginModle extends BaseModle {
//真正的登陆逻辑
public void loginUser(String userId, String pwd) {
System.out.println("登陆》》");
}
}
3.Fragment的懒加载
Fragment1 fragment1 = new Fragment1();
//开启懒加载的支持,默认不不开启
fragment1.openLazyLoad(true);
下面是Fragment1的具体实现
public class Fragment1 extends BaseFragment {
private String TAG = "Fragment1>>";
@Override
public int getLayoutId() {
return R.layout.fragment1;
}
@Override
public void initView(View rootView) {
Log.d(TAG, "初始化Fragment1");
}
@Override
public void lazyLoadData() {
Log.d(TAG, "Fragment1懒加载数据");
Toast.makeText(getActivity(), "Fragment 1", Toast.LENGTH_SHORT).show();
}
}
如果开启了懒加载,则会回掉lazyLoadData()这个方法,在这里请求数据,否则不执行,
除非手动调用,默认情况下没有开启懒加载模式,所以请求数据等操作就放在initView中
去做。
额外在BaseActivity中提供了四个方法
public void setInitContentView(boolean init){
initContentView=init;
}
public void setInitViews(boolean init){
initViews=init;
}
public boolean isInitContentView(){
return initContentView;
}
public boolean isInitViews(){
return initViews;
}
这四个方法分别对应setContentView()和initViews()这两个方法,默认不用关心,如果调用者在
使用时有特殊的需求,比如自定义一个BaseActivity继承BaseMvpActivity或者BaseActivity,对
setContentView和initViewsiew方法调用中间会有一些逻辑处理就可以使用上面提供的方法
在子类中动态调用setContentView和initViews方法而避免子类和父类调用两次这两个方法。如下
public abstract class DSMvpActivity<V, P extends BasePresenter<V>> extends BaseMvpActivity<V,P> {
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(getLayoutId());
//加入butterKnife
ButterKnife.bind(this);
initView(savedInstanceState);
setInitContentView(true);
setInitViews(true);
super.onCreate(savedInstanceState);
}
}
上面的例子 需要在setContentView后initViews之间初始化butterKnife,就可以这样做。
好用的Retrofit配合Rxjava的请求库 https://github.com/jingzhanwu/RetrofitRxjavaClient
Android 开发工具库 https://github.com/jingzhanwu/DevUtils
一个包含拍照 录制 高度定制的多媒体库 https://github.com/jingzhanwu/MediaLibrary
欢迎大家提问题和意见。