上一篇我们对比介绍了 Gson 和 Kotlinx.serialization,很多小伙伴在后台留言说,moshi 呢? Moshi 怎么解决 Kotlin 数据类的问题? 我们上一篇文章提到 Gson 不认识 Kotlin,所以对 Kotlin 的数据类几乎没有支持,这包括构造器的默认值、初始化逻辑的调用等等,而 Moshi 则类似于 Kotlinx.serialization
import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit class MainActivity
import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity import kotlinx.coroutines.async import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity import kotlinx.coroutines.async import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity import kotlinx.coroutines.async import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity import kotlinx.coroutines.flow.flow import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.runBlocking import java.io.IOException
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.runBlocking import kotlinx.coroutines.flow.buffer import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.delay import kotlinx.coroutines.flow.buffer import kotlinx.coroutines.flow.collect import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.runBlocking import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.runBlocking
This is a guide on core features of kotlinx.coroutines with a series of examples, divided up into different 想要使用 Kotlin 协程,需要单独添加依赖: compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version : '1.2.2' 先用一个官方的demo,直观认识一下协程: import kotlinx.coroutines.* fun main() { GlobalScope.launch { // 我们再写一个稍微丰富一点的例子: package com.kotlin.notes.coroutine import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import java.lang.Thread.sleep
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeout class MainActivity : AppCompatActivity at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run(EventLoop.common.kt:507) at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277) at kotlinx.coroutines.DefaultExecutor.run(DefaultExecutor.kt:69) at java.lang.Thread.run import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeoutOrNull class MainActivity
:kotlinx-coroutines-android:1.6.1 | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core :1.6.1 | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1 | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (c) | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1 (c) | | | | | \---
kim.hsl.coroutine import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.AbstractFlow import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.runBlocking import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity() { override fun onCreate
: 子协程 的取消 不会影响 同一层级的 兄弟协程的执行 ; 通过抛出异常取消协程 : 协程取消通常会通过 抛出 CancellationException 异常 实现 ; 挂起函数取消 : 定义在 kotlinx.coroutines :497) 17:20:56.632 W at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt: W at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:61) 17:20:56.633 W at kotlinx.coroutines.BuildersKt.runBlocking (Unknown Source:1) 17:20:56.633 W at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default (Builders.kt:40) 17:20:56.633 W at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.runBlocking import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.runBlocking :277) at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:87) at kotlinx.coroutines.BuildersKt import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { val TAG = "MainActivity (DispatchedTask.kt:106) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely (CoroutineScheduler.kt:678) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch class MainActivity : AppCompatActivity (DispatchedTask.kt:106) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely
configurations.all { resolutionStrategy { force 'org.jetbrains.kotlinx:kotlinx-coroutines-core :1.4.2' } } } async后发现依赖中只有一个了: 还是报错,这时候会不会觉得这个 force也不行,稍等,查看下,发现 接着把kotlinx-coroutines-android configurations.all { resolutionStrategy { force 'org.jetbrains.kotlinx:kotlinx-coroutines-core :1.4.2', "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2" } } } 再查看依赖: 这样变编译通过了
:kotlinx-coroutines-android:1.6.1 | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core :1.6.1 | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1 (c) | | | | | \--- :kotlinx-coroutines-android:1.6.1 | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1 (c) | | | | | \---
com.aruba.flowapplyapplication.model.Article import com.aruba.flowapplyapplication.net.RetrofitClient import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch /** * Created by aruba on 2021 com.aruba.flowapplyapplication.databinding.FragmentArticleBinding import com.aruba.flowapplyapplication.viewmodel.ArticleViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch class ArticleFragment : Fragment() { private val articleViewModel
:kotlinx-coroutines-android:1.6.1 | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core :1.6.1 | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1 | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (c) | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1 (c) | | | | | \---
(ResumeMode.kt:67) at kotlinx.coroutines.DispatchedKt.resume(Dispatched.kt:309) at kotlinx.coroutines.DispatchedKt.dispatch :332) at kotlinx.coroutines.EventLoopImplBase$DelayedResumeTask.run(EventLoop.kt:298) at kotlinx.coroutines.EventLoopImplBase.processNextEvent (EventLoop.kt:116) at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:80) at kotlinx.coroutines.BuildersKt ) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:36) at kotlinx.coroutines.BuildersKt.runBlocking :128) at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:94) at kotlinx.coroutines.EventLoopImplBase
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity() { override fun onCreate import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking class MainActivity : AppCompatActivity() { override fun onCreate import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.launch
import kotlinx.coroutines.\* fun main() { GlobalScope.launch { // 在后台启动一个新的协程并继续 delay(200) import kotlinx.coroutines.\* fun main() = runBlocking { delay(100) // 在这里可以用delay了 GlobalScope.launch import kotlinx.coroutines.\* fun main() = runBlocking { // this: CoroutineScope launch { delay import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking 再举一个例子 import kotlinx.coroutines.\* fun main() = runBlocking { GlobalScope.launch { for (i in
androidx.legacy:legacy-support-v4:1.0.0' //依赖协程核心库 ,提供Android UI调度器 implementation "org.jetbrains.kotlinx :kotlinx-coroutines-core:1.5.1" //依赖当前平台所对应的平台库 (必须) implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android import kotlinx.coroutines.flow.flow import okhttp3.OkHttpClient import okhttp3.Request import java.io.File import com.dongnaoedu.flowpractice.utils.copyTo import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch