初识Android MVP(笔记)

来源:互联网 发布:手机网络爸爸 编辑:程序博客网 时间:2024/04/30 04:43

断断续续地看了一段时间的Android MVP,之前怎么都看不懂,今天就好像突然地被点破了一样,看懂了一些,然后就算开始入门了,做些笔记。

其实之前的那些道理或是图还算看得懂,但就是看不懂它的代码,它的流程,具体实现这些。

首先思路被打通是看了纸飞机的一个知乎日报的MVP实现,周末的时候跟踪那些函数跳着跳着就突然理解了,但那个时候还是不懂得具体实现,所以今天其实就像之前入门RxJava的时候一样,既然什么都不懂,那就跟着它们照敲一遍就行了。

首先看下结构:


我发现这个项目跟Google的那个to-do MVP的实现基本一样,虽然平时我们用Activity直接做某个页面的展示,但是它这里是在Activity里嵌套个fragment,这个fragment才是真正的界面,而Activity只是用来做View和Presenter的实例化而已,我一直很纳闷为什么要这样做,但在一篇文章里的评价是虽然麻烦,但这个代价还是值得的,当然它是可选的,主要是为了拥有单独的Presenter类。

先看下代码:

BasePresenter:

public interface BasePresenter {    void start();}

BaseView:

public interface BaseView<T> {    void setPresenter(T presenter);}

MVPContract:

public interface MVPContract {    interface View extends BaseView<Presenter>{        void showText(String text);    }    interface Presenter extends BasePresenter{        void doSomething();    }}


MVPPresenter:

public class MVPPresenter implements MVPContract.Presenter{        private MVPContract.View mView;    private Context mContext;    public MVPPresenter(Context context, MVPContract.View view){        this.mView = view;        this.mContext = context;        view.setPresenter(this);    }    @Override    public void doSomething() {        Log.i("MVPPresenter" , "do something");        mView.showText("hello");    }        @Override    public void start() {    }}

MVPTestActivity:

public class MVPTestActivity extends AppCompatActivity implements View.OnClickListener {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_mvp_test);                MVPFragment mvpFragment = MVPFragment.newInstance();        getSupportFragmentManager().beginTransaction().add(R.id.fl_container, mvpFragment).commit();        new MVPPresenter(MVPTestActivity.this, mvpFragment);    }}


MVPFragment:

public class MVPFragment extends Fragment implements MVPContract.View, View.OnClickListener {    private MVPContract.Presenter presenter;    private Button button;    private TextView textview;    public static MVPFragment newInstance() {        Bundle args = new Bundle();        MVPFragment fragment = new MVPFragment();        fragment.setArguments(args);        return fragment;    }    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        View view = inflater.inflate(R.layout.fragment_mvp_test, container, false);        presenter.start();        initView(view);        return view;    }    @Override    public void showText(String text) {        textview.setText(text);    }    @Override    public void setPresenter(MVPContract.Presenter presenter) {        if (presenter != null) {            this.presenter = presenter;        }    }    private void initView(View view) {        button = (Button) view.findViewById(R.id.button);        textview = (TextView) view.findViewById(R.id.textview);        button.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.button:                presenter.doSomething();                break;        }    }}


这样我们其实基本就实现了Fragment只是用来做显示数据,而真正的操作是在Presenter里。

这里面还是有些东西我不太懂,我应该是基础知识语法这方面还是有不小的欠缺,毕竟这里面的接口多起来,所以逻辑上我就有些搞不懂了。


首先我断点跟了一下:

1.调用MVPTestActivity里的

new MVPPresenter(MVPTestActivity.this, mvpFragment);


2.然后就会对MVPPresenter进行实例化,进入了构造函数:

 public MVPPresenter(Context context, MVPContract.View view){        this.mView = view;        this.mContext = context;        view.setPresenter(this);    }

3.当执行到
 view.setPresenter(this);

即调用了setPresenter的接口时


4.就会跳到MVPFragment里的:

 @Override    public void setPresenter(MVPContract.Presenter presenter) {        if (presenter != null) {            this.presenter = presenter;        }    }

5.于是就完成了Fragment与Presenter的连接。所以接下来要做什么动作,就在contract的presenter里自定义一个方法名,然后在MVPPresenter里做实际操作,在Fragment里调用即可。

注:contract是合同的意思,用“合同接口”能方便的管理View和Presenter,这也确实是个很方便的地方。

待续。。。



参考:MVP之Android官方MVP架构学习—View层和Presenter层

          Android构架系列之二--MVP&&Clean理解与实践之MVP

0 0
原创粉丝点击