MVP+Okhttp3+Retrofit2+Rxjava2 框架实现

一、MVP

简称:MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。(from 百度)

MVP模式_百度百科:https://baike.baidu.com/item/MVP%E6%A8%A1%E5%BC%8F/10961746?fr=aladdin

MVC造成的问题:①View 层和 Controller 层没有分离,逻辑混乱;②View 和 Controller 层的耦合,导致 Activity 或者 Fragment 臃肿,代码量很大。因此为了解决以上问题,我们使用MVP模式

参考文章:https://upload-images.jianshu.io/upload_images/3013099-4008dabb029fa246.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

当 View 需要更新数据时,通过 Presenter 去找 Model 请求数据,Model 获取到数据后通知 Presenter,Presenter 再通知 View 更新数据,使得 Model 和 View 不会直接交互,所有的交互都由 Presenter 进行,Presenter 充当了桥梁的角色。很显然,Presenter 必须同时持有 View 和 Model 的对象的引用,才能在它们之间进行通信。

参考文章:https://blog.csdn.net/singwhatiwanna/article/details/80841705

二、Okhttp3
参考文章:https://www.jianshu.com/p/9f2c982cd500

Square公司的一款开源的网络请求库
工作流程:通过OkHttpClient将构建的Request转换为Call,然后在RealCall中进行异步或同步任务,最后通过一些的拦截器interceptor发出网络请求和得到返回的response。

依赖库:

//网络请求okhttp3
compile'com.squareup.okhttp3:okhttp:3.9.1'
//日志的拦截器
compile'com.squareup.okhttp3:logging-interceptor:3.6.0'

三、Retrofit2

Square公司开发的一款针对Android 网络请求的框架(底层默认是基于OkHttp 实现)。

依赖库

    //Retrofit2库
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    //gson解析
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0

四、Rxjava2
一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库),RxJava使异步操作变得非常简单。

   //rxjava2库
    compile 'io.reactivex.rxjava2:rxjava:2.0.1'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

基本了解了几个开源框架后,我们进入实战,看到我的项目结构:


MVP+Okhttp3+Retrofit2+Rxjava2 框架实现_第1张图片
项目结构图

第一步:新建mode类

拿到需要请求的API数据,粘贴API到谷歌浏览器回车查看数据,jsonhandle插件自动格式化数据
MVP+Okhttp3+Retrofit2+Rxjava2 框架实现_第2张图片
json数据

创建数据的model类
MVP+Okhttp3+Retrofit2+Rxjava2 框架实现_第3张图片
AppVersionModel.java

Retrofit2基于Gson解析,尽量把数据中的每个字段都描述到,model类增加构造方法、getter/setter方法、toString方法。

第二步:初始化Retrofit
新建RetrofitHelper.java。用于初始化Retrofit,设置请求API的baseUrl、gson解析方式


MVP+Okhttp3+Retrofit2+Rxjava2 框架实现_第4张图片
RetrofitHelper.java

新建RetrofitService.java。管理Retrofit的各种数据请求(post、get),包含请求api、请求参数。


MVP+Okhttp3+Retrofit2+Rxjava2 框架实现_第5张图片
RetrofitService.java

注意:post请求中必须增加注解@FormUrlEncoded,否则会报异常。

第三步:View的接口类

public interface AppVersionView extends View{
    void onSuccess(AppVersionModel appVersion);
    void onError(String error);
}

第四步:Presenter的接口类

/**
 * Created by wuhuihui on 2019/5/17.
 * Presenter:基类方法用于Activity或Fragment在onDestory解绑View
 * 所有presenter的基类,子类实现其方法,
 */
public interface Presenter {
    void onCreate();
    void onStart();
    void onDestory();
    void pause();
    void attachView(View view);
    void attachIncomingIntent(Intent intent);
}

对于请求的实现Presenter类

class AppVersionPresenter implements Presenter
 @Override
    public void onCreate() {
        manager = new DataManager(context);
        compositeDisposable = new CompositeDisposable();
        //RxJava1: mCompositeSubscription = new CompositeSubscription();
    }

    @Override
    public void onDestory() {
        if (compositeDisposable != null && !compositeDisposable.isDisposed()) {
            compositeDisposable.dispose(); //解除订阅
            compositeDisposable.clear(); //取消所有订阅
            compositeDisposable = null;
            //RxJava1:CompositeSubscription.unsubscribe();
        }
    }

网络请求封装

 public void getAppVersion(String currentVersion, String type) {
        Observable observable = manager.getAppVersion(currentVersion, type);
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        compositeDisposable.add(d);
                    }

                    @Override
                    public void onNext(AppVersionModel value) {
                        appVersion = value;
                    }

                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();
                        Log.i(TAG, "onError:" + e.toString());
                        appVersionView.onError("请求失败:\n" + e.toString());
                    }

                    @Override
                    public void onComplete() {
                        Log.i(TAG, "onComplete!");
                        if (appVersionView != null) {
                            appVersionView.onSuccess(appVersion);
                            Log.i(TAG, "appVersion:" + appVersion.toString());
                        }
                    }
                });
    }

第五步:DataManager:数据处理管理器,用于处理多个API Observable

/**
 * Created by wuhuihui on 2019/5/17.
 * DataManager:数据处理管理器,用于处理多个API Observable
 */
public class DataManager {
    private RetrofitService retrofitService;
    public DataManager(Context context) {
        this.retrofitService = RetrofitHelper.getInstance(context).getServer();
    }
    public Observable getAppVersion(String currentVersion, String type) {
        return retrofitService.getAppVersion(currentVersion, type);
    }
}

第六步:网络请求实现并显示数据 MainActivity.java
MainActivity的布局中放两个控件, Button requestData点击按钮实现网络请求,TextView showData用来显示数据。

private AppVersionPresenter appVersionPresenter = new AppVersionPresenter(this);

appVersionPresenter.getAppVersion("6.0", "android"); //开始请求数据
appVersionPresenter.onCreate(); //启动Presenter,订阅View
        //刷新UI,显示数据
        appVersionPresenter.attachView(new AppVersionView() {
            @Override
            public void onSuccess(AppVersionModel appVersion) {
                showData.setText(appVersion.getLatestVersion()
                        + "\n" + appVersion.getSize()
                        + "\n" + appVersion.getUrl()
                        + "\n\n新版本更新内容:\n"
                );

                List list = appVersion.getFunctions();
                for (int i = 0; i < list.size(); i++) {
                    showData.append(list.get(i) + "\n");
                }
            }

            @Override
            public void onError(String error) {
                showData.setText(error);
            }
        });
//当activity onDestroy时取消对View的引用
 @Override
    protected void onDestroy() {
        super.onDestroy();
        appVersionPresenter.onDestory(); //取消view的引用,避免内存泄漏
    }

运行结果:


MVP+Okhttp3+Retrofit2+Rxjava2 框架实现_第6张图片
显示数据

大概的代码实现已经讲完,基本的框架思路已经成型。
最后附上gitHub地址:https://github.com/wuhuihui2016/InitMVP.git。
应该庆幸有这么一段待业期,让我重新认识自己,重新审视自己的傲娇,至少能够认识到自己的不足并及时补救,就为时未晚。任重而道远,加油,还有更多技术、框架值得去深究,保持学习的心态,学到老活到老。学习不是浅尝辄止,每一次都应该用心实现,善始善终。
每天进步一点点,技术分享还在更新。。。
路过的大神们,希望对你们有帮助,同时如果有更好的见解和意见,请多多评论指正,也期待得到您的喜欢与支持~~~ (190517)
上一篇:Android XMPP实现即时通讯:https://www.jianshu.com/p/f0cef68eb9ac
下一篇:OKHttp LoggingInterceptor的使用:https://www.jianshu.com/p/53a9125d610d
我的更多学习分享:https://www.jianshu.com/u/57ab9a74e2c0

你可能感兴趣的:(MVP+Okhttp3+Retrofit2+Rxjava2 框架实现)