Android 搭建好用的MVP框架(Retrofit+Rxjava2+ButterKnife)

前言

最近在新项目中看了很多MVP框架,然后自己搭建了MVP框架,所以在这里总结一下,拿出来希望大家能相互学习一下。

一、基本架构

MVP的构成简单介绍一下,全称:Model-View-Presenter;它是从经典的模式MVC演变而来,它们的基本思想有相通的地方:
Controller/Presenter负责逻辑的处理
Model提供数据
View负责显示

首先把目录让大家看一下。有一个基本的了解。
这里写图片描述

1、Base系列

base系列都是为了能轻松的写好公共代码部分。
BasePresenter

public interface BasePresenter {
    void subscribe();

    void unSubscribe();
}

这两个方法就是为了能控制Presenter中的对象的生命周期而定义的。这也是MVP框架的一个优化。

BaseView

public interface BaseView<T> {

}

另外两个就不展示了,大体都一样。

二、MainActivity的搭建

1、MainContart
interface MainContract {
    interface View extends BaseView<Presenter> {
        void onError(String s);

        void onSuccess(BookBean bookBean);
    }

    interface Presenter extends BasePresenter {
        void getData(String search);
    }
}

这个类的存在就是为了能统一管理View和Presenter的方法,要新增方法直接在这里写上然后去对应页面alt+Enter就可以了。
这里View的泛型T设置为下面的这个Presenter接口。

二、MainPresenter

然后再弄这个Presenter

class MainPresenter implements MainContract.Presenter {
    private MainContract.View view;

    MainPresenter(MainContract.View view) {
        this.view = view;
    }

    @Override
    public void subscribe() {
    }

    @Override
    public void unSubscribe() {
    }

    @Override
    public void getData(String search) {
    }
}

这里是在构造器中绑定View层。

然后再贴一份已经写好内容的Presenter类

class MainPresenter implements MainContract.Presenter {
    private MainContract.View view;
    private CompositeDisposable compositeDisposable;

    MainPresenter(MainContract.View view) {
        this.view = view;
        compositeDisposable = new CompositeDisposable();
    }

    @Override
    public void subscribe() {
    }

    @Override
    public void unSubscribe() {
        compositeDisposable.clear();
    }

    @Override
    public void getData(String search) {
        RetrofitManager.getInstance().getServer().searchBook("小王子")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<BookBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        compositeDisposable.add(d);
                    }

                    @Override
                    public void onNext(BookBean value) {
                        view.onSuccess(value);
                    }

                    @Override
                    public void onError(Throwable e) {
                        view.onError(e.toString());
                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}
三、MainActivity

最后再在activity界面继承View接口

public class MainActivity extends AppCompatActivity implements MainContract.View {
    @BindView(R.id.activity_text)
    TextView textView;

    private MainContract.Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        presenter = new MainPresenter(this);
        presenter.getData("数据");
    }

    @Override
    protected void onResume() {
        super.onResume();
        presenter.subscribe();
    }

    @Override
    protected void onPause() {
        super.onPause();
        presenter.unSubscribe();
    }

    @Override
    public void onError(String s) {
        Log.e("error", s);
    }

    @Override
    public void onSuccess(BookBean bookBean) {
        textView.setText(bookBean.toString());
    }
}

在onCreate中初始化MainPresenter类。

四、Retrofit+Rxjava2

RetrofitManager管理工具类:

public class RetrofitManager {
    private Retrofit retrofit;

    private RetrofitManager() {
        init();
    }

    private void init() {
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
                Request original = chain.request();
                Request.Builder requestBuilder = original.newBuilder();
                //请求体定制:统一添加token参数
                if (original.body() instanceof FormBody) {
                    FormBody.Builder newFormBody = new FormBody.Builder();
                    requestBuilder.method(original.method(), newFormBody.build());
                }
                Request request = requestBuilder.build();
                return chain.proceed(request);
            }
        }).build();

        retrofit = new Retrofit.Builder()
                .baseUrl(SERVER_HOST)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .callFactory(client)
                .build();

    }

    public ApiService getServer() {
        return retrofit.create(ApiService.class);
    }

    public static RetrofitManager getInstance() {
        return RetrofitManagerHolder.INSTANCE;
    }

    private static class RetrofitManagerHolder {
        private static final RetrofitManager INSTANCE = new RetrofitManager();
    }

}

ApiService接口类:

public interface ApiService {
    @GET("v2/book/search")
    Observable<BookBean> searchBook(@Query("tag") String tag);
}

这两个的使用方法的学习就各自去搜索学习资料吧,还是很丰富的。

总结

这里就是我在项目中使用的基本MVP框架,在实际使用中感觉还可以,之前一直在用MVC没有接触MVP,但真正用上了MVP感觉还是不难的,只要跨出了第一步,剩下的都OK。
如果对我的这个框架有什么的意见的话,欢迎大家能在评论中指出,不胜感激~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值