前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我对MVP的理解

我对MVP的理解

作者头像
项勇
发布2019-12-12 21:34:24
4760
发布2019-12-12 21:34:24
举报
文章被收录于专栏:项勇

MVP框架的浅谈

  • 最近部门变革,一口气招了5个新人,我们之前的ABC组也已经全部取消,重组拆分为研发/技术支持/新手村,我暂时分在研发组,负责音乐/视频代码的重构,代码重构的目的一个是为了适配安卓9.0,一个是重构代码框架结构,降低耦合,以便日后降低对音乐/视频代码修改难度,还有一个更远期的目标是能通过换壁纸的形式,直接实现新UI;

我对MVP框架的理解

  • View:视图层(Activity,fragment)
  • Presenter:连接view和module的枢纽,一切逻辑控制都由它负责
  • Module:数据模型,数据处理
之前一个Activity一口气做完的事现在拆分为三个部分,三个部门各司其职,View只负责控件的控制,Module负责处理逻辑,Presenter是个中间纽带传话的关系,为了方便,现在我的音乐做法是将Module和Presenter合并起来,将逻辑层与显示层区分开。
然后都是说起来容易做起来难,之前卡住的地方就是不知道View如何持有Presenter,Presenter不知如何发数据给View,后来看各种资料终于过了这道坎,贴一个别人的范例

MvpPresenter

代码语言:javascript
复制
public class MvpPresenter implements Contarct.Presenter {
    private Contarct.View MvpView;
    public MvpPresenter(Contarct.View mvpView) {        MvpView = mvpView;        MvpView.setPresenter(this);    }

    @Override    public void start() {        MvpView.showLoading();        GetData();    }

    //学习    List data = new ArrayList();
    private void GetData() {        Observable.create(new ObservableOnSubscribe<List<String>>() {            @Override            public void subscribe(@NonNull ObservableEmitter<List<String>> e) throws Exception {                for (int i = 0; i < 50; i++) {                    data.add( "学会了第"+i + "招");                }                e.onNext(data);            }        }).subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Observer<List<String>>() {                    @Override                    public void onSubscribe(Disposable d) {
                    }
                    @Override                    public void onNext(List<String> strings) {                        MvpView.hideLoading();                        MvpView.setListItem(data);                    }
                    @Override                    public void onError(Throwable e) {                        MvpView.failed();                    }
                    @Override                    public void onComplete() {
                    }                });    }
    @Override    public void itemclick(int position) {        MvpView.showMessage("放第" + position+"招");    }}

MvpActivity

代码语言:javascript
复制
public class MvpActivity extends AppCompatActivity implements Contarct.View, AdapterView.OnItemClickListener {
    private ListView mvpListView;    private Contarct.Presenter mPresenter;    private ProgressBar pb;
    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_mvp);        mvpListView = (ListView) findViewById(R.id.mvp_listview);        mvpListView.setOnItemClickListener(this);        pb = (ProgressBar) findViewById(R.id.mvp_loading);        new MvpPresenter(this);        mPresenter.start();    }
    @Override    public void showLoading() {        pb.setVisibility(View.VISIBLE);    }
    @Override    public void hideLoading() {        pb.setVisibility(View.GONE);    }
    @Override    public void setListItem(List<String> data) {        ArrayAdapter adapter = new ArrayAdapter(MvpActivity.this, android.R.layout.simple_list_item_1, data);        mvpListView.setAdapter(adapter);    }
    @Override    public void failed() {        Toast.makeText(MvpActivity.this, "练习失败", Toast.LENGTH_SHORT).show();    }
    @Override    public void showMessage(String message) {        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();    }
    @Override    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        mPresenter.itemclick(position);    }
    @Override    public void setPresenter(Contarct.Presenter presenter) {        this.mPresenter = presenter;    }}

BasePresenter

代码语言:javascript
复制
public interface BasePresenter<T> {
    void start();
}

BaseView

代码语言:javascript
复制
public interface BaseView<T> {
    void setPresenter(T presenter);
}

Contarct

代码语言:javascript
复制
public interface Contarct {
    interface View extends BaseView<Presenter> {
        void showLoading();
        void hideLoading();
        void setListItem(List<String> data);
        void failed();
        void showMessage(String message);
    }

    interface Presenter extends BasePresenter {
        void itemclick(int position);
    }

}

代码十分通俗易懂,打个比喻,Contarct是武器库

,里面包含了机器人所有的使能,例如狼牙棒,流星锤,突火枪...,MvpActivity是空手机器人

,MvpPresenter就是这些武器的使用秘笈

,运行起来的流程就是机器人拿起狼牙棒,看了武林秘籍后,从此称霸武林

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 项勇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MVP框架的浅谈
  • 我对MVP框架的理解
    • 之前一个Activity一口气做完的事现在拆分为三个部分,三个部门各司其职,View只负责控件的控制,Module负责处理逻辑,Presenter是个中间纽带传话的关系,为了方便,现在我的音乐做法是将Module和Presenter合并起来,将逻辑层与显示层区分开。
      • 然后都是说起来容易做起来难,之前卡住的地方就是不知道View如何持有Presenter,Presenter不知如何发数据给View,后来看各种资料终于过了这道坎,贴一个别人的范例
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档