Kotlin 24. Kotlin coroutine 中 Dispatchers 的使用

一起来学Kotlin:概念:22. Kotlin coroutine 中 Dispatchers 的使用

  • Dispatchers.Main,用于 Android 主线程。用于调用 suspend 函数,UI 框架操作,及更新 LiveData 对象。launch 在不加参数时,其默认值是 Dispatchers.Main
  • Dispatchers.IO:非主线程。用于磁盘操作(例如,Room 操作),及网络 I/O 请求(例如,调用服务器 API)。
  • Dispatchers.Default:非主线程,用于 CPU 密集型操作,就是说,需要花时间processing的。例如,list 排序,及 JSON 解析,图像处理计算等。

这里举一个读取URL图像的例子:

class MainActivity : AppCompatActivity() {

    private val IMAGE_URL = "https://i.kinja-img.com/gawker-media/image/upload/t_original/lj7y7c52vl96rjs4qjvx.jpg"
    private val coroutineScope = CoroutineScope(Dispatchers.Main)
    // Dispatchers.Main:Android 主线程。用于调用 suspend 函数,UI 框架操作,及更新 LiveData 对象。
    // coroutine 将运行在主线程,而不是 I/O 专用的线程中。
    // launch 在不加参数时,其默认值是 Dispatchers.Main。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        coroutineScope.launch {
            // 这里我们先读取原图像
            val imageLoad = coroutineScope.async(Dispatchers.IO) { getOriginalBitmap() }
            // Dispatchers.IO:非主线程。用于磁盘操作(例如,Room 操作),及网络 I/O 请求(例如,调用服务器 API)。
            // Here we call the function getOriginalBitmap on the IO dispatcher.
            val originalBitmap: Bitmap = imageLoad.await()

            // 然后我们使用简单的图像处理将输入图像进行灰度。
            val processedImageLoad = coroutineScope.async(Dispatchers.Default) { imageProcess(originalBitmap) }
            // Dispatchers.Default 主要用于 CPU 密集型操作,就是说,需要花时间processing的。例如,list 排序,及 JSON 解析,图像处理计算等。
            val filteredBitmap: Bitmap = processedImageLoad.await()

            // wait for the bitmap
            loadImage(filteredBitmap)
        }
    }

    private fun getOriginalBitmap() =
        URL (IMAGE_URL).openStream().use {
            BitmapFactory.decodeStream(it)      // decode the stream into bitmap
        }

    private fun loadImage(bmp: Bitmap) {
        progressBar.visibility = View.GONE
        imageView.setImageBitmap(bmp)
        imageView.visibility = View.VISIBLE
    }

    private fun imageProcess(inputBitmap: Bitmap) = Filter.apply(inputBitmap)

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

破浪会有时

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

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

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

打赏作者

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

抵扣说明:

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

余额充值