MVP最新理解 不给Prensenter 写接口

谷歌的做法是:首先写一个上帝接口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_suremPresenter .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);
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序邦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值