美文网首页
你还在用 Retrofit + RxJava 吗? 不不, Ok

你还在用 Retrofit + RxJava 吗? 不不, Ok

作者: Troy_Zhou | 来源:发表于2020-04-25 11:07 被阅读0次

    第一篇:OkHttp 优雅封装 OkHttps 之 气海雪山初探
    第二篇:OkHttp 优雅封装 OkHttps 之 上传下载解密
    第三篇:OkHttp 优雅封装 OkHttps 之 回调线程魔变

    简介

    OkHttps 是 OkHttp 的超轻量封装包。

    和 Retrofit 相比,它更加轻量(只有 59Kb),是 Retrofit (124Kb)的一半,而且更加的开箱即用,API 更加自然和语义化。

    OkHttps 用起来很优美,可以链式调用,有点像 RxJava 却比 RxJava 更简单。

    中文官网:http://okhttps.ejlchina.com/

    项目地址

    Gitee:https://gitee.com/ejlchina-zhxu/okhttps
    GitHub:https://github.com/ejlchina/okhttps

    起步

    Maven

    <dependency>
         <groupId>com.ejlchina</groupId>
         <artifactId>okhttps</artifactId>
         <version>1.0.4</version>
    </dependency>
    

    Gradle

    implementation 'com.ejlchina:okhttps:1.0.4'
    

    安卓中使用需要把 JDK 版本调成 1.8,在 app 模块的 build.gradle 中加入以下配置即可:

    android {
        // 省略其它配置..
        compileOptions {
            sourceCompatibility = 1.8
            targetCompatibility = 1.8
        }
    }
    

    在正式开始之前,我们依然假设,下文中出现http均是构建好的HTTP实例(详细请看前文):

    HTTP http = HTTP.builder().build();
    

    OK,一切就绪,我们接着上篇文章继续讲。

    实现生命周期绑定(for Android)

    由于 OkHttps 并不依赖于 Android,所以它并不提供生命周期绑定的直接实现,但它的一些扩展机制让我们很容易就可以实现这个需求。在开始之前,我们首先来理解何为生命周期绑定:

    所谓的生命周期绑定:即是让 HTTP 任务感知其所属的 Activity 或 Fragment 的生命周期,当 Activity 或 Fragment 将被销毁时,框架应自动的把由它们发起的但尚未完成的 HTTP 任务全部取消,以免导致程序出错!

    现在我们需要对HTTP实例进行配置,配置后的HTTP实例具有生命周期绑定的功能,在ActivityFragment里,它的使用效果如下:

    // 在 Activity 或 Fragment 内发起请求
    http.async("http://www.baidu.com")
            .bind(getLifecycle())   // 绑定生命周期
            .setOnResponse((HttpResult result) -> {
                Log.i("FirstFragment", "收到请求:" + result.toString());
            })
            .get();
    

    上述代码中的getLifecycle()ActivityFragment自带的方法,而bind()HttpTask的现有方法。在配置好HTTP实例后,上述代码发起的请求便可以感知ActivityFragment的生命周期。

    HTTP实例到底该如何配置呢?

    第一步:配置预处理器

    HTTP http = HTTP.builder()
            ... // 省略其它配置项
            .addPreprocessor((Preprocessor.PreChain chain) -> {
                HttpTask<?> task = chain.getTask();
                Object bound = task.getBound();
                // 判断 task 是否绑定了 Lifecycle 对象
                if (bound instanceof Lifecycle) {
                    // 重新绑定一个 生命周期监视器(LCObserver)对象,它的定义见下一步
                    task.bind(new LCObserver(task, (Lifecycle) bound));
                }
                chain.proceed();
            })
            ... // 省略其它配置项
            .build();
    

    第二步:定义生命周期监视器

    public class LCObserver implements LifecycleObserver {
    
        HttpTask<?> task;
        Lifecycle lifecycle;
    
        LCObserver(HttpTask<?> task, Lifecycle lifecycle) {
            this.task = task;
            this.lifecycle = lifecycle;
            lifecycle.addObserver(this);
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        public void onStop() {
            task.cancel();  // 在 ON_STOP 事件中,取消对应的 HTTP 任务
        }
    
        public void unbind() {
            // 在请求完成之后移除监视器
            lifecycle.removeObserver(this);
        }
    
    }
    

    第三步:配置全局回调监听

    以上两步其实已经实现了生命周期绑定的功能,但是在请求完成之后,我们需要在lifecycle中移除LCObserver对象:

    HTTP http = HTTP.builder()
            ... // 省略其它配置项
            .completeListener((HttpTask<?> task, HttpResult.State state) -> {
                Object bound = task.getBound();
                // 判断 task 是否绑定了生命周期监视器(LCObserver)对象
                if (bound instanceof LCObserver) {
                    // 解绑监视器
                    ((LCObserver) bound).unbind();
                }
                return true;
            })
            ... // 省略其它配置项
            .build();
    

    以上三步便在Android中实现了生命周期与HTTP请求绑定的功能

    是不是非常简单呢,懒得敲代码的同学还可以 点这里 OkHttps.java 直接下载封装好的源码,其中不仅编写了生命周期绑定的配置,还有在UI线程执行回调的配置。

    有需要的同学,可以直接下载下来使用,还可以基于它再次扩展,比如实现自动添加 TOKEN 的功能,具体可以参考原文的 6.5 串行预处理器(TOKEN问题最佳解决方案),再比如扩展实现生命周期与下载事件绑定的功能,实现起来都非常简单。


    如果这个项目还不错,就到这里点个小星星吧

    Gitee:https://gitee.com/ejlchina-zhxu/okhttps
    GitHub:https://github.com/ejlchina/okhttps


    前篇文章:OkHttp 优雅封装 OkHttps 之 回调线程魔变

    相关文章

      网友评论

          本文标题:你还在用 Retrofit + RxJava 吗? 不不, Ok

          本文链接:https://www.haomeiwen.com/subject/lnphwhtx.html