1.协程-为何要用协程

一、 什么是协程

  • 1.协程是 kotlin 为我们提供的线程切换框架,它和 AsyncTask 丶 RxJava 干的事情一样;
  • 2.协程并不会提高效率,只会提高代码的可读性;
  • 3.协程并不是线程,他只负责切换线程。
    在这里插入图片描述

二、 Android的切换线程历史

先说作用之前,我们来说下 Android 线程切换的的历史。

讲解之前个大家提醒一个实战用例,大伙可以想一想,用下面的线程切换技术你会如何实现呢?
1:一个界面需要 2 个接口同时请求成功,当 2 个接口都请求成功的时候渲染界面(注意:2 个接口需要在2个线程中请求哦)。
2:1个界面需要 2 个接口顺序请求,第二个接口需要依赖第一个接口的返回数据做参数。

  • 1.本质 Handler 切换
    有人会说:用 Handler 切换也挺开心的啊?我用 Handler 切换线程超级牛B,我连 Handler 原理都知道的一清二楚的。其实这种方式切换线程的致命缺点就是 地狱回调.
    在这里插入图片描述
  • 2.AsyncTask封装
    其实 AsyncTask 就是对异步任务做了一次封装(好像所有的框架都是封装)。但是治标不治本,还是规避不了地狱回调的问题,还且很多场景无法使用。
    在这里插入图片描述
  • 3.一直到 RxJava 的出现 Android 的这个问题才有所缓解。当我第一次使用 RxJava 的时候,我发现这东西真是太好用了,但是我发现这个东西学习成本非常高。操作符的复杂,以及原理都非常难理解。让我 RxJava 从入门到放弃。

到这里,大家应该发现上面的 3 种方案每一种都有一些弊端,相比较最好的方案应该就是 RxJava 的流失线式的切线程更为的智能,并且异常也能统一管理。

  • 4.Kotlin 的推广带来了新的切线程方案,它可以以同步代码的写法写出异步的功能。

三、协程的作用

通过上面的讲解,我们知道了所有的线程框架,都想解决一个问题 地狱回调 问题。那么我们理想的线程切换是啥样的呢?来看下伪代码:

void initView() {
    // 主线程展示加载Dialog
    展示加载Dialog()
    // 异步网络请求等待数据返回
    val data = 异步请求网络数据()
    // 主线程dismissDialog()
    消失Dialog()
    // 主线程渲染View
    主线程根据数据展示修改View状态(data)
}

看上面的伪代码,大家思考下 Java 能实现这样的功能吗?仔细想 Java 是不可能的实现这样的代码,语法根本不支持,Java 中不可能存在异步方法能返回数据。
最终协程就是为了解决这个问题而诞生。哪有人说 Java 不支持,作为儿子的 Kotlin 协程怎么会支持呢?其实 Koltin 能实现这样的代码是因为 Kotlin 的编译器欺骗了你的眼睛

fun initView() {
    启动一个协程 {
        // 1:主线程展示加载Dialog
        展示加载Dialog()
        // 2:异步网络请求,执行一个挂起函数
        val data = 异步请求网络数据()
        // 3:主线程dismissDialog()
        消失Dialog()
    }
}

看上方的伪代码,我们首先启动了一个协程,剩下的主要有 3 句代码,第一句代码没啥好说的。

关键在第二句代码 协程 有一个挂起的概念,意思是我执行一个挂起函数,调用我的主线程你可以去干其他事啦,等我干完事情我再通知你,执行我后面的第三句代码。

仔细回味第二句代码的解释有没有类似回调的意思?我们经常写的回调函数的作用,不就是通知我们做完事情了吗?

其实 Kotlin 的协程挂起函数实现原理就是通过回调来实现的。你看似 1 2 3 句代码写在一起,其实在编译后的 Class 字节码并不是写在一起的, Kotlin 的编译器欺骗了你的眼睛。

四、总结

通过上面的解释,我们最终总结下 Kotlin 的协程?

  • 1.协程的目的是想让我们用同步代码,写出异步功能
  • 2.协程负责帮我们在执行完挂起函数后切换线程
  • 3.挂起函数最终也是通过回调函数来实现的
  • 4.协程写的同步代码看似写在一起,其实最终编译后挂起函数前后的代码是分开的。

最后提醒大家,不要用看 Java 代码的思想,去看 Kotlin 的协程,不然你会进入一个闭环的。因为有时候你眼睛看到的和最终生成的 Java 代码是不一样的,Kotlin 的编译器会欺骗你的眼睛。

在C++20引入的协程(coroutines)机制中,`promise_type` 是协程实现的核心组件之一,它用于定义协程内部的行为和状态管理。你提到的“协程三要素”中的 promise 类型正是指这个 `promise_type`,它与返回类型(return type)和可等待类型(awaitable type)配合使用,共同构成完整的协程逻辑。 ### 协程三要素详解: 1. **返回类型(Return Type)**: - 通常是协程函数返回的句柄(handle),例如 `std::future<T>` 或自定义的 `AsyncAction`、`AsyncOperation<T>` 等。 - 它是对协程执行结果的封装。 2. **Promise 类型(Promise Type)**: -协程状态的拥有者,负责管理协程的生命周期、返回值、异常、暂停和恢复等行为。 - 通常需要定义 `promise_type` 类型,并提供 `get_return_object()`、`initial_suspend()`、`final_suspend()`、`unhandled_exception()` 等关键函数。 3. **Awaitable 类型(Awaitable Type)**: - 支持 `co_await` 操作,可以挂起当前协程直到某个异步操作完成。 - 通常实现了 `await_ready()`、`await_suspend()`、`await_resume()` 方法。 --- ### 示例:使用 promise_type 实现一个简单的协程 ```cpp #include <coroutine> #include <iostream> // 自定义返回类型 struct MyCoroutine { struct promise_type; using handle_type = std::coroutine_handle<promise_type>; handle_type coro; MyCoroutine(handle_type h) : coro(h) {} bool done() const { return coro.done(); } void resume() const { coro.resume(); } }; // 定义 promise_type struct MyCoroutine::promise_type { MyCoroutine get_return_object() { return MyCoroutine{handle_type::from_promise(*this)}; } std::suspend_always initial_suspend() { return {}; } std::suspend_always final_suspend() noexcept { return {}; } void return_void() {} void unhandled_exception() { std::terminate(); } }; // 协程函数 MyCoroutine simple_coroutine() { std::cout << "协程开始执行\n"; co_await std::suspend_always{}; std::cout << "协程恢复执行\n"; } int main() { auto coro = simple_coroutine(); coro.resume(); // 第一次恢复,执行 initial_suspend 之后的代码 coro.resume(); // 第二次恢复,执行 final_suspend 之前的代码 } ``` --- ### 解释: - `promise_type` 是协程的“大脑”,它决定了协程何时开始、何时暂停、何时结束。 - `get_return_object()` 返回协程函数最终返回的对象(这里是 `MyCoroutine`)。 - `initial_suspend()` 决定协程在启动时是否自动挂起。 - `final_suspend()` 决定协程执行完 `co_return` 后是否挂起。 - `return_void()` 处理无返回值的情况(如果是有返回值的协程,则使用 `return_value()`)。 - `unhandled_exception()` 处理未捕获的异常。 --- ### 总结: `promise_type` 是协程机制中最重要的组成部分之一,它控制协程的行为,包括生命周期、挂起与恢复、异常处理等。理解 `promise_type` 是掌握 C++ 协程的关键。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄毛火烧雪下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值