關於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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章