为什么用MVP架构
其实我们日常开发中的Activity,Fragment和XML界面就相当于是一个 MVC 的架构模式,Activity中不仅要处理各种 UI 操作还要请求数据以及解析。
这种开发方式的缺点就是业务量大的时候一个Activity 文件分分钟飙到上千行代码,想要改一处业务逻辑光是去找就要费半天劲,而且有点地方逻辑处理是一样的无奈是不同的 Activity 就没办法很好的写成通用方法。
那 MVP 为啥好用呢?
MVP 模式将Activity 中的业务逻辑全部分离出来,让Activity 只做 UI 逻辑的处理,所有跟Android API无关的业务逻辑由 Presenter 层来完成。
将业务处理分离出来后最明显的好处就是管理方便,但是缺点就是增加了代码量。
下面我做的就是使用MVP搭建好之后做一个网络请求数据的操作
- 抽取BaseActivity类继承AppCompatActivity并写抽象方法
- 创建接口MyCallBack写调取状态
- M层(Model接口写调用方法并设置参数)
- ModelImpl连接接口Model实现网络请求并把数据传给MyCallBack
- IView接口写启动状态的方法
- IPresenter接口调用拿到数据启动的方法
- IPresenterImpl连接接口IPresenter并传入数据
- MainActivity实现接口和里边的方法做相应操作
1.抽取BaseActivity类继承AppCompatActivity并写抽象方法
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
protected abstract int getLayout();
protected abstract void initViews();
protected abstract void setOnClicks();
void init(){
if(getLayout() != 0){
setContentView(getLayout());
initViews();
setOnClicks();
}
};
2. 创建接口MyCallBack写调取状态
public interface MyCallBack<T> {
void getDataSuccess(T success);
void getDataError(T error);
}
3. M层(Model接口写调用方法并设置参数)
public interface Model {
void Post(String httpurl , int index , MyCallBack myCallBack);
}
4. ModelImpl连接接口Model实现网络请求并把数据传给MyCallBack
public interface Model {
void Post(String httpurl , int index , MyCallBack myCallBack);
}
5. IView接口写启动状态的方法
public interface IView<T> {
void startDataSuccess(T success);
void startDataError(T error);
}
6. IPresenter接口调用拿到数据启动的方法
public interface IPresenter {
void startData(String httpUrl,int index);
}
7. IPresenterImpl连接接口IPresenter并传入数据
public class IPresenterImpl implements IPresenter {
private IView iView;
private ModelImpl model;
public IPresenterImpl(IView iView) {
this.iView = iView;
model = new ModelImpl();
}
@Override
public void startData(final String httpUrl, int index) {
model.Post(httpUrl, index, new MyCallBack() {
@Override
public void getDataSuccess(Object success) {
iView.startDataSuccess(success);
}
@Override
public void getDataError(Object error) {
iView.startDataError(error);
}
});
}
}
8.MainActivity实现接口和里边的方法做相应操作
public class MainActivity extends BaseActivity implements IView ,XListView.IXListViewListener{
private final String successUrl = "http://www.xieast.com/api/news/news.php?page=";
private int index = 1;
private XListView xListView;
private MyAdapter baseAdapter;
private IPresenterImpl iPresenter;
private List<ListBean.DataBean> listAll = new ArrayList<>();
@Override
protected int getLayout() {
return R.layout.activity_main;
}
@Override
protected void initViews() {
iPresenter = new IPresenterImpl(this);
xListView = findViewById(R.id.xlistView);
baseAdapter = new MyAdapter(MainActivity.this);
xListView.setAdapter(baseAdapter);
xListView.setPullLoadEnable(true);
xListView.setXListViewListener(this);
iPresenter.startData(successUrl,index);
}
@Override
protected void setOnClicks() {
}
@Override
public void startDataSuccess(Object success) {
ListBean bean = (ListBean) success;
List<ListBean.DataBean> list = bean.getData();
listAll.addAll(list);
baseAdapter.setList(listAll);
xListView.stopRefresh();//停止刷新
xListView.stopLoadMore();//停止加载更多
}
@Override
public void startDataError(Object error) {
}
@Override
public void onRefresh() {
index=1;
listAll.clear();
iPresenter.startData(successUrl,1);
}
@Override
public void onLoadMore() {
index++;
iPresenter.startData(successUrl,index);
}
}