Android中MVP框架的使用
MVP不仅仅限于Fragment或Activity,还可以运用到ViewGroup中。使用时可以自行决定把MVP运用到什么地方,前提是view是独立的,这样presenter才能在不与其他 Presenter冲突的情况下控制View。
业务分层
MVP的相关概念:
M(model)代表的是将会显示在view(UI)中的数据。严格意义上来说, Model指的应该是检索或控制一个Model的业务逻辑层。
V(view)是显示数据(model)并且将用户指令(events)传送到presenter以便作用于那些数据的一个接口。View通常含有Presenter的引用。
P(presenter)扮演的是“中间人”的作用,且presenter同时引用view和model。
Model,View和Presenter三者应解耦。理论上来说presenter和业务逻辑层都是纯旧式的能够与桌面应用或其他任何java应用共享的java代码。如果让Presenter 执行OnClickListener,Presenter就被绑定到了Android平台上。
MVP模式下,从数据库中查询或显示User列表的具体流程如图:
各层的实现
model层
- model层属于数据层,负责数据的处理。包括dao操作,net操作,IO操作等。无需进行明确的分层。
- 在以模块分包的情况下,对应模块可以建立一个Service,负责进行业务的封装。
View层
- View层可以是一个Activity或者Fragment,继承自MvpActivity或MvpFragment。(MvpActivity或MvpFragment完成界面的相关初始化工作)
MvpActivity类:
public abstract class MvpActivity extends Activity implements MvpView {
/**
* 初始化界面布局
*
* @return 布局id
*/
protected abstract int getLayoutId();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
injectViews();
}
private void injectViews() {
ButterKnife.bind(this);// 界面绑定
}
}
MvpFragment类:
public abstract class MvpFragment extends Fragment {
protected abstract int getLayoutId();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(getLayoutId(), container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
injectViews(view);
}
/**
* ButterKnife injection
*
* @param view
*/
private void injectViews(View view) {
ButterKnife.bind(this, view);
}
}
- 实现一个继承自MvpView用于进行界面更新的View接口。
MvpView 类:
/**
* MvpView是所有view的基类。从根本上说这只是一个空的interface 。
*/
public interface MvpView {
}
例如,实现一个查询数据库并刷新的界面,view接口需提供相关的界面更新接口。
DemoView 类:
public interface DemoView extends MvpView{
void showProgress();//显示进度条
void hideProgress();//隐藏进度条
void setItems(List<String> items);//更新数据
void showMessage(String message);//显示提示
}
presenter层
- 界面业务逻辑控制中心,presenter继承MvpPresenter。
MvpPresenter类:
public class MvpPresenter<V extends MvpView> {
protected V viewDelegate;
public MvpPresenter() {
}
/**
* 保存状态
*/
public void onSaveInstanceState(Bundle outState) {
}
/**
* 恢复状态
*/
public void onRestoreInstanceState(Bundle savedInstanceState) {
}
public void onCreated(Bundle savedInstanceState) {
}
public void onResume() {
}
public void onPause() {
}
/**
* 进行一些资源的释放
*/
public void onDestroy() {
viewDelegate = null;
}
}
MvpPresenter包含生命周期相关的一些方法,子类可重写相关方法,实现相关业务逻辑。重写onSaveInstanceState与onRestoreInstanceState,在屏幕旋转或生命周期遭到破坏时,进行数据的缓存与恢复。onDestroy()方法用于相关资源的释放
view层创建一个presenter对象,presenter持有相关的view对象。
MVP的使用
创建一个 View 继承 MvpView,提供界面更新的相关接口。
创建一个 Activity 继承自 MvpActivity 或创建一个继承自 MvpFragment 的 Fragmen,重写 getLayoutId() 方法。实现View接口,实现界面的更新操作。Activity只关心界面的更新操作,不涉及具体的业务逻辑。
创建 Presenter 继承 MvpPresenter,完成界面的各项业务逻辑。
Activity 在onCreate() 方法实例化一个 Presenter 对象,并传人当前 View,Activity 通过调用 Presenter 对象的相关方法完成实现业务,Presenter 通过调用 View 的相关接口来更新Activity 界面。
源码下载
示例源码下载:
https://github.com/wobuaihuangjun/DatabaseManager
参考文章:http://www.open-open.com/lib/view/open1432779807863.html