谷歌的做法是:首先写一个上帝接口BasePresenter,然后在每个功能模块里都写了协议类名为...合同,在其中封装了模块下的搜索接口和演示接口,同时给景观设定了泛型,就是当前协议类中演示:
/ **
*这个类声明了该模块下View和Presenter的协议
* BaseView和BasePresenter都是很简单的上帝接口
* /
public interface AddEditTaskContract {
interface View 扩展 BaseView < Presenter > {
void showEmptyTaskError();
...
}
interface Presenter 扩展 BasePresenter {
void saveTask(String title,String description);
...
}
}
这种管理方式的好处是,将浏览和演示管理起来,强化其一一对应的关系,便于操作
原文链接:HTTP://blog.karumi.com/interfaces-for-presenters-in-mvp-are-a-waste-of-time/
在上面的图解中型号包含了所有实现业务逻辑的代码.Presenter负责实现展示逻辑,视图是抽象化视图的接口。
以后开发可以按照此方式来写
1.写一个合同接口里面包含了查看的接口和Presenter的业务接口
public interface AddEditTaskContract { 接口视图扩展 BaseView <Presenter> { void setTitle(String title); boolean isActive(); } interface Presenter extends BasePresenter { void saveTask(String title); } }
2.写一个View(以后所有的视图都要写成一个组合控件,和Activity解耦)
public class AddEditTaskView extends ScrollView implements AddEditTaskContract.View, View.OnClickListener { private TextView mTitle; private TextView mTvSure; private AddEditTaskContract.Presenter mPresenter; @Override public void setPresenter(AddEditTaskContract.Presenter presenter) { mPresenter = checkNotNull(presenter); } private boolean mActive; public AddEditTaskView(Context context) { super(context); init(); } public AddEditTaskView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { inflate(getContext(), R.layout.addtask_view_content, this); mTitle = (TextView) findViewById(R.id.add_task_title); mTvSure = (TextView) findViewById(R.id.tv_sure); mTvSure.setOnClickListener(this); mActive = true; } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); mActive = true; } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); mActive = false; } @Override public void setTitle(String title) { mTitle.setText(title); } @Override public boolean isActive() { return mActive; } public String getTitle() { return mTitle.getText().toString(); } @Override public void onClick(View view){ switch(view.getId()){ case R.id. tv_sure: mPresenter .saveTask(getTitle()); 打破 ; } } }3.写一个演示类用于处理业务
公共类 VideoListTaskPresenter实现 VideoListContract.Presenter { @NonNull private final VideoListContract.View mAddTaskView ; int page = 1 ; String catalogId = “” ; Handler handler = new Handler(); Subscription subscription; List<VideoType> videos; public VideoListTaskPresenter(@NonNull VideoListContract.View addTaskView, String catalogId) { mAddTaskView = StringUtils.checkNotNull(addTaskView); mAddTaskView.setPresenter(this); this.catalogId = catalogId; } @Override public void start() { } @Override public void onRefresh() { page = 1; handler.postDelayed(new Runnable() { @Override public void run() { getVideoList(MyApplication.mContext, catalogId, page); } }, 1000); } private void getVideoList(Context context, String catalogID, int page) { subscription = Network.getVideoApi(context) .getVideoList(catalogID, page + "") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); } Observer<VideoResult> observer = new Observer<VideoResult>() { @Override public void onCompleted() { if (mAddTaskView.isActive()) { mAddTaskView.getAdapter().pauseMore(); } } @Override public void onError(Throwable e) { // Toast.makeText(MyApplication.mContext, R.string.loading_failed, Toast.LENGTH_SHORT).show(); if (page > 1) mAddTaskView.getAdapter().pauseMore(); } @Override public void onNext(VideoResult result) { if (result != null) { if (mAddTaskView.isActive()) { videos = result.ret.list; if (page == 1) { mAddTaskView.getAdapter().clear(); if (videos != null && videos.size() < 30) { mAddTaskView.getAdapter().setMore(new View(mAddTaskView.getContexts()), mAddTaskView.getLoadMoreListener()); mAddTaskView.getAdapter().setError(new View(mAddTaskView.getContexts())); mAddTaskView.getAdapter().setNoMore(new View(mAddTaskView.getContexts())); } } mAddTaskView.getAdapter().addAll(videos); } } } }; @Override public void pauseMore() { handler.postDelayed(new Runnable() { @Override public void run() { //刷新 page++; getVideoList(MyApplication.mContext, catalogId, page); } }, 1000); } @Override public void onItemClickView(int position) { switchData(mAddTaskView.getAdapter().getItem(position)); if (mAddTaskView.getContexts() instanceof MVPVideoListActivity) { Intent intent = new Intent(mAddTaskView.getContexts(), VideoInfoActivity.class); intent.putExtra("videoInfo", videoInfo); mAddTaskView.getContexts().startActivity(intent); } } VideoInfo videoInfo; private void switchData(VideoType videoType) { if (videoInfo == null) videoInfo = new VideoInfo(); videoInfo.title = videoType.title; videoInfo.dataId = videoType.dataId; videoInfo.pic = videoType.pic; videoInfo.airTime = videoType.airTime; videoInfo.score = videoType.score; } }4.写一个测试活动类,里面持有视图和演示实例
/ ** *测试MVP活动 * / public class AddEditTaskActivity extends BaseActivity { AddEditTaskView addEditTaskView ; AddEditTaskPresenter 主持人 ; @Override protected void onCreate(Bundle savedInstanceState){ super .onCreate(savedInstanceState); 的setContentView(R.layout addtask_act); addEditTaskView =(AddEditTaskView)findViewById(R.id。add_edit_task_view); presenter = new AddEditTaskPresenter(addEditTaskView); } }