关于MVP的学习总结

关于什么是MVP,以及它的原理我就不拷贝了,这里主要写一下学习体会和总结吧!
本例是结合Retrofit请求的,可能代码不全。

大概步骤:
一,M V P三个基类

BaseModel

// 就是一个接口,啥也没有。
public interface BaseModel {
}

BaseView

// 还是一个接口,啥也没有
public interface BaseView {

}

BasePresenter

public class BasePresenter {
	// 持有model层的引用
    protected BaseModel model;
	// 持有View层的弱引用,View层一般是Activity和Fragment。
    protected WeakReference<BaseView> viewReference;
}

二,实现M、V、P
定义Model层 PageModel,在model层做网络请求,每一个网络请求定一个方法:

package com.txhl.testapp.mvp.model;

import com.txhl.testapp.bean.CreditBean;
import com.txhl.testapp.bean.Shebao;
import com.txhl.testapp.bean.User;
import com.txhl.testapp.interf.GetRequest_Interface;
import com.txhl.testapp.mvp.base.BaseModel;
import com.txhl.testapp.mvp.listener.PageListener;
import com.txhl.testapp.mvp.listener.ShebaoListener;
import com.txhl.testapp.utils.RetrofitU;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * Created by chen.yingjie on 2019/5/28
 * description
 */
public class PageModel implements BaseModel {

    private GetRequest_Interface request;

    public PageModel() {
        request = RetrofitU.getRetrofit().create(GetRequest_Interface.class);
    }

    public void getCredit(final PageListener listener) {
        request.getCredit()
                .subscribeOn(Schedulers.io())
                .doOnNext(new Consumer<CreditBean>() {
                    @Override
                    public void accept(CreditBean creditBean) throws Exception {
                        // 处理数据,比如操作数据库等等这些操作耗时,再次操作不会导致界面卡顿

                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<CreditBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(CreditBean creditBean) {
                        listener.onCreditSuccess(creditBean);
                    }

                    @Override
                    public void onError(Throwable e) {
                        listener.onCreditFailed(e);
                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    public void getShebao(String accout, long time, String sign, String id, final ShebaoListener listener) {
        request.postShebao(accout, time, sign, id)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Shebao>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Shebao shebao) {
                        listener.onShebaoSuccess(shebao);
                    }

                    @Override
                    public void onError(Throwable e) {
                        listener.onShebaoFailed(e);
                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

注:定义的接口方法随意,比如下载的,可以再定义onProgress(), onStart(), onComplete()等。
PageListener

public interface PageListener {

    void onCreditSuccess(CreditBean creditBean);

    void onCreditFailed(Throwable e);
}

ShebaoListener

public interface ShebaoListener {

    void onShebaoSuccess(Shebao shebao);

    void onShebaoFailed(Throwable e);
}

定义View层 PageView,这里的方法和listener对应,主要是为了接收P层传回来的M层的请求结果。

package com.txhl.testapp.mvp.view;

import com.txhl.testapp.bean.CreditBean;
import com.txhl.testapp.bean.Shebao;
import com.txhl.testapp.mvp.base.BaseView;

/**
 * Created by chen.yingjie on 2019/5/28
 * description
 */
public interface PageView extends BaseView {

    // Credit

    void onCreditSuccess(CreditBean creditBean);

    void onCreditFailed(Throwable e);

    // Shebao


    void onShebaoSuccess(Shebao shebao);

    void onShebaoFailed(Throwable e);
}

定义Persenter层 PagePresenter,它持有PageModel和BaseView的对象,作为一个中间者来完成结果的传递。

package com.txhl.testapp.mvp.presenter;

import com.txhl.testapp.bean.CreditBean;
import com.txhl.testapp.bean.Shebao;
import com.txhl.testapp.mvp.base.BasePresenter;
import com.txhl.testapp.mvp.base.BaseView;
import com.txhl.testapp.mvp.listener.PageListener;
import com.txhl.testapp.mvp.listener.ShebaoListener;
import com.txhl.testapp.mvp.model.PageModel;
import com.txhl.testapp.mvp.view.PageView;

import java.lang.ref.WeakReference;

/**
 * Created by chen.yingjie on 2019/5/28
 * description
 */
public class PagePresenter extends BasePresenter {

    public PagePresenter(PageView creditView) {
        this.model = new PageModel();
        this.viewReference = new WeakReference<BaseView>(creditView);
    }

    public void getCredit() {
        if (model != null && viewReference != null && viewReference.get() != null) {
            final PageView pageView = (PageView) viewReference.get();
            if (pageView == null) return;
            ((PageModel)model).getCredit(new PageListener() {
                @Override
                public void onCreditSuccess(CreditBean creditBean) {
                        pageView.onCreditSuccess(creditBean);
                }

                @Override
                public void onCreditFailed(Throwable e) {
                        pageView.onCreditFailed(e);
                }
            });

        }
    }

    public void getShebao(String accout, long time, String sign, String id) {
        if (model != null && viewReference != null && viewReference.get() != null) {
            final PageView shebaoView = (PageView)viewReference.get();
            if (shebaoView == null) return;
            ((PageModel)model).getShebao(accout, time, sign, id, new ShebaoListener() {

                @Override
                public void onShebaoSuccess(Shebao shebao) {
                    shebaoView.onShebaoSuccess(shebao);
                }

                @Override
                public void onShebaoFailed(Throwable e) {
                    shebaoView.onShebaoFailed(e);
                }
            });
        }
    }
}

三,Activity实现View层
这里通过Persenter对象调用Model请求网络,实现View层接口来拿到结果。

package com.txhl.testapp.mvp.view.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.txhl.testapp.R;
import com.txhl.testapp.bean.CreditBean;
import com.txhl.testapp.bean.Shebao;
import com.txhl.testapp.mvp.presenter.PagePresenter;
import com.txhl.testapp.mvp.view.PageView;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class PageActivity extends AppCompatActivity implements PageView {

    @BindView(R.id.tvContent)
    TextView tvContent;
    @BindView(R.id.btnLoad)
    Button btnLoad;
    @BindView(R.id.btnShebao)
    Button btnShebao;

    private PagePresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ButterKnife.bind(this);

        mPresenter = new PagePresenter(this);


    }

    @Override
    public void onCreditSuccess(CreditBean creditBean) {
        tvContent.setText(creditBean.toString());
    }

    @Override
    public void onCreditFailed(Throwable e) {

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) mPresenter = null;
    }

    @OnClick({R.id.btnLoad, R.id.btnShebao})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.btnLoad:
                mPresenter.getCredit();
                break;
            case R.id.btnShebao:
                mPresenter.getShebao("testaccount", 20180705091735L, "Uwd1qpOOrAlLjK0cJp3BQA==", "410225197309151058");
                break;
        }
    }

    @Override
    public void onShebaoSuccess(Shebao shebao) {
        tvContent.setText(shebao.toString());
    }

    @Override
    public void onShebaoFailed(Throwable e) {

    }
}

使用步骤:
1,定义 Model 层的 PageModel,定义单个请求方法,如:getCredit;传入一个接口参数,用来把请求结果回调给 Persenter 层;
2,定义 View 层的 PageView,来接收Persenter层通知;
3,定义 Persenter 层的 PagePresenter,持有View层和Model层对象,作用:在 Model 层完成请求之后,调用 View 层对应方法通知 View 层。
4,activity 实现 View 层接口 PageView,实现它的方法之后就可以拿到 Model 层请求结果。

总结:
activity通过Persenter对象调用Model层请求数据,Model层通过回调接口把数据给Persenter层,Persenter层通过View层接口回调结果给activity。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值