广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 软件教程 > Java技术 > 正文

惠州OkHttps如何实现线程自由切换?_北大青鸟IT学校

作者:邓华发布时间:2021-06-14分类:Java技术浏览:1050


导读:OkHttps如何实现线程自由切换?学过Java的同学都遇到过这个问题,那么答案是什么呢?接下来一起来看看惠州北大青鸟老师是怎么回答的。

OkHttps如何实现线程自由切换?学过Java的同学都遇到过这个问题,那么答案是什么呢?接下来一起来看看惠州北大青鸟老师是怎么回答的。

  在 Android 开发中,经常会把某些代码放到特点的线程去执行,比如网络请求响应后的页面更新在主线程(UI线程)执行,而保存文件则在IO线程操作。OkHttps 为这类问题提供了良好的方案。

  在 默认 情况下,所有回调 函数都会 在 IO 线程 执行。为什么会设计如此呢?这是因为 OkHttps 只是纯粹的 Java 领域 Http工具包,本身对 Android 不会有任何依赖,因此也不知 Android 的 UI 线程为何物。这么设计也让它在 Android 之外有更多的可能性。

  但是在 Android 里使用 OkHttps 的话,UI线程的问题能否优雅的解决呢?当然可以!简单粗暴的方法就是配置一个 回调执行器:

  1. HTTP http = HTTP.builder()

  2.         .callbackExecutor((Runnable run) -> {

  3.             // 实际编码中可以吧 Handler 提出来,不需要每次执行回调都重新创建

  4.             new Handler(Looper.getMainLooper()).post(run); // 在主线程执行

  5.         })

  6.         .build();

  上述代码便实现了让 所有 的 回调函数 都在 主线程(UI线程) 执行的目的,如:

  1. http.async("/users")

  2.         .addBodyParam("name", "Jack")

  3.         .setOnProcess((Process process) -> {

  4.             // 在主线程执行

  5.         })

  6.         .setOnResponse((HttpResult result) -> {

  7.             // 在主线程执行

  8.         })

  9.         .setOnException((Exception e) -> {

  10.             // 在主线程执行

  11.         })

  12.         .setOnComplete((State state) -> {

  13.             // 在主线程执行

  14.         })

  15.         .post();

  但是,如果同时还想让某些回调放在IO线程,实现 自由切换,怎么办呢?OkHttps 给出了非常灵活的方法,如下:

  1. http.async("/users")

  2.         .addBodyParam("name", "Jack")

  3.         .setOnProcess((Process process) -> {

  4.             // 在主线程执行

  5.         })

  6.         .nextOnIO()          // 指定下一个回调在 IO 线程执行

  7.         .setOnResponse((HttpResult result) -> {

  8.             // 在 IO 线程执行

  9.         })

  10.         .setOnException((Exception e) -> {

  11.             // 在主线程执行(没有指明 nextOnIO 则在回调执行器里执行)

  12.         })

  13.         .nextOnIO()          // 指定下一个回调在 IO 线程执行

  14.         .setOnComplete((State state) -> {

  15.             // 在 IO 线程执行

  16.         })

  17.         .post();

  无论是哪一个回调,都可以使用nextOnIO()方法自由切换。同样,对于文件下载也是一样:

  1. http.sync("/download/test.zip")

  2.         .get()

  3.         .getBody()

  4.         .setOnProcess((Process process) -> {

  5.             // 在主线程执行

  6.         })

  7.         .toFolder("D:/download/")

  8.         .nextOnIO()          // 指定下一个回调在 IO 线程执行

  9.         .setOnSuccess((File file) -> {

  10.             // 在 IO 线程执行

  11.         })

  12.         .setOnFailure((Failure failure) -> {

  13.             // 在主线程执行

  14.         })

  15.         .start();

想了解更多关于Java的资讯吗?可以来惠州北大青鸟新方舟校区了解一下。

java4.png

Java

标签:惠州计算机JAVA软件开发惠州计算机Java软件开发惠州计算机JAVA培训惠州计算机JAVA软件开发学校惠州计算机Java软件开发培训JAVAJava软件开发北大青鸟IT计算机学校北大青鸟IT软件学校北大青鸟IT学校


Java技术排行
标签列表
网站分类
文章归档
最近发表