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

2020-04-29 09:36 更新

  由于 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问题最佳解决方案),再比如扩展实现生命周期与下载事件绑定的功能,都非常简单。

如果觉得 OkHttps 还不错,就去点个 Star 吧,项目地址:


官方网站:http://okhttps.ejlchina.com/

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号