android 一个轻巧的MVP框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010648159/article/details/85715679
概述

因为写了很多小app,业务逻辑并不是很复杂,涉及到的技术也不多,所以一直都想弄一个轻巧点的框架,只需要请求网络,拿到网络数据即可。于是就有了下边这篇文章,不喜勿喷,个人记录。

背景: 现在比较流行的框架当然是MVP,网上有很多demo,我觉得讲的比较好,扩展性高,耦合性低就有一个MVPArms这个框架不仅仅讲了mvp模式,还有比如加载图片怎样降低耦合等,在我们写不出比作者更优秀的框架之前,我们都应该去模仿,去仔细思考为何要这么写。

这只是第一版,有一些不足
(1) 说网络请求都要写在ApiService这个类里面,因为在BasePresenter里面创建的retrofit service就只是ApiService。
(2) 网络请求应该和P层进行隔离,这样后续就算有复杂的业务逻辑,P类可读性就不会那么低。

效果图如下
在这里插入图片描述

首先看BaseActivity

public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView {

    protected P mPresenter;

    private LoadingDialog mDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentResId());
        ButterKnife.bind(this);

        mDialog = new LoadingDialog(this);

        mPresenter = initPresenter();
    }

    public abstract int getContentResId();

    protected abstract P initPresenter();


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

    @Override
    public void showProgress() {
        if (mDialog != null && !mDialog.isShowing()) {
            mDialog.show();
        }
    }

    @Override
    public void hideProgress() {
        if (mDialog != null && mDialog.isShowing()) {
            mDialog.cancel();
        }
    }
}

BasePresenter

public class BasePresenter<V extends IBaseView, B> implements HttpCallBack<B> {

    protected V iView;

    private CompositeDisposable mCompositeDisposable;

    protected ApiService mApiService;

    protected BasePresenter(V view) {
        this.iView = view;
        mApiService = RetrofitManager.getInstance().getRetrofit().create(ApiService.class);
    }

    public <B> void requestHttp(String tag, Flowable<BaseBean<B>> flowable) {
        initCompositeDisposable();
        showProgress();
        FlowableCallBack<B> flowableCallBack = flowable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribeWith(new FlowableCallBack<B>(tag, this));

        mCompositeDisposable.add(flowableCallBack);
    }

    @Override
    public void onSuccess(String tag, BaseBean<B> o) {

    }

    @Override
    public void onFinish(String tag) {
        if (iView != null)
            iView.hideProgress();
    }

    @Override
    public void onFailed(String tag, Throwable throwable) {

    }

    private void showProgress() {
        if (iView != null) {
            iView.showProgress();
        }
    }

    private void initCompositeDisposable() {
        if (mCompositeDisposable == null) {
            mCompositeDisposable = new CompositeDisposable();
        }
    }

    public void destroy() {
        unDispose();
        detachView();
    }

    private void detachView() {
        if (iView != null) {
            iView.hideProgress();
            iView = null;
        }
    }

    private void unDispose() {
        if (mCompositeDisposable != null) {
            mCompositeDisposable.clear();
        }
        mCompositeDisposable = null;
    }

}

IBaseView类

public interface IBaseView {

    void showProgress();

    void hideProgress();

}

核心类都贴出来了,我们看看在实例中如何使用
IMainView类,这是当网络请求成功的时候,需要回调到Activity页面

public interface IMainView extends IBaseView {

    void loadInfoBeanSuccess(InfoBean infoBean);

    void loadWeacherBeanSuccess(WeacherBean weacherBean);

}

MainPresenter类,进行网络请求,并且拿到请求结果

public class MainPresenter extends BasePresenter<IMainView, BaseBean> {

    public static final String TAG = "MainPresenter";

    public MainPresenter(IMainView view) {
        super(view);
    }

    public void getInfoBeans() {
        requestHttp("getInfoBeans", mApiService.getInfo("yule", "d687fc2c061e23ca2abae9d653eb089a"));
    }

    public void getWeacherBeans() {
        requestHttp("getWeacherBeans", mApiService.getWeacherInfo("北京", "08e039171e23350af52ed943ce8aaed7"));
    }

    @Override
    public void onSuccess(String tag, BaseBean o) {
        super.onSuccess(tag, o);

        if ("getInfoBeans".equals(tag)) {
            InfoBean infoBean = (InfoBean) o.getResult();
            Log.e(TAG, "返回结果是" + infoBean);
            iView.loadInfoBeanSuccess(infoBean);

        } else if ("getWeacherBeans".equals(tag)) {
            WeacherBean weacherBean = (WeacherBean) o.getResult();
            Log.e(TAG, "返回结果是" + weacherBean);

            iView.loadWeacherBeanSuccess(weacherBean);
        }

    }

    @Override
    public void onFailed(String tag, Throwable throwable) {
        super.onFailed(tag, throwable);
    }

}

MainActivity类,发出请求

public class MainActivity extends BaseActivity<MainPresenter> implements IMainView {

    @BindView(R.id.id_tv_content)
    TextView id_tv_content;

    @Override
    public int getContentResId() {
        return R.layout.activity_main;
    }

    @Override
    protected MainPresenter initPresenter() {
        return new MainPresenter(this);
    }


    @OnClick({R.id.id_btn_request_yule, R.id.id_btn_request_weacher})
    public void click(View view) {
        int id = view.getId();
        switch (id) {
            case R.id.id_btn_request_yule:
                mPresenter.getInfoBeans();

                break;
            case R.id.id_btn_request_weacher:
                mPresenter.getWeacherBeans();

                break;
        }
    }


    @Override
    public void loadInfoBeanSuccess(InfoBean infoBean) {
        if (infoBean == null) {
            return;
        }
        StringBuilder sb = new StringBuilder();
        List<InfoBean.ThumbnailBean> data = infoBean.getData();
        for (InfoBean.ThumbnailBean bean : data) {
            sb.append(bean.getAuthor_name()).append("\n");
        }
        id_tv_content.setText(sb.toString());
    }

    @Override
    public void loadWeacherBeanSuccess(WeacherBean weacherBean) {

        if (weacherBean == null) {
            return;
        }
        WeacherBean.Today today = weacherBean.getToday();
        StringBuilder sb = new StringBuilder();
        sb.append(today.getCity()).append(today.getWind()).append(today.getDressing_advice());

        id_tv_content.setText(sb.toString());
    }

}

全部代码在github上,欢迎start和提问题
github

猜你喜欢

转载自blog.csdn.net/u010648159/article/details/85715679