协程的简单使用

1、协程作用范围。

  • 全局有效。
// 开启协程
GlobalScope.launch(Dispatchers.Main) {
    // TODO
}
  • 生命周期内有效。
// 定义一个管理协程工作的工具,例如网络请求时,中断操作。
private val viewModelJob = SupervisorJob()
// 定义一个有作用在主线程且可管理的作用域。
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
// 开启协程
uiScope.launch() {
    // TODO
}

override fun onCleared() {
    super.onCleared()
    //生命周期结束时回收,类似Rxjava的Dispose。
    viewModelJob.cancel()
}

1、基本使用。

  • 开启同步协程。
GlobalScope.launch(Dispatchers.Main) {
    L.d("1")
    // 同步协程会在遇到协程时挂起,和阻塞线程不是一个概念。
    GlobalScope.launch(Dispatchers.IO) {
        Thread.sleep(2000)
        L.d("2")
    }
    L.d("3")
}

输出:

123

  • 开启异步协程。
GlobalScope.launch(Dispatchers.Main) {
    L.d("1")
    var deferred1 = async { 
        GlobalScope.launch(Dispatchers.IO) {
            Thread.sleep(1000)
            L.d("2")
        }
    }
    var deferred2 = async { 
        GlobalScope.launch(Dispatchers.IO) {
            Thread.sleep(2000)
            L.d("3")
        }
    }
    deferred1.await()
    deferred2.await()
    L.d("4")
}

输出:

1234

2、协程的缩写。

fun coroutine() {
    GlobalScope.launch(Dispatchers.Main) {
        // TODO
    }
}

可以写成:

// suspend 是协程标签,用于编译器检查协程方法,本身没有意义。
suspend fun coroutine() = withContext(Dispatchers.Main) {
    // TODO
}

3、协程的挂起回调。

suspend inline fun  getHttpModel(
    url: String,
    header: HttpHeaders?,
    params: HttpParams?,
    isUseCache: Boolean
) = suspendCoroutine {
    val type = object : TypeToken() {}.type
    val get = MMCHttp.get(url)
    if (params != null) {
        get.params(params)
    }
    if (header != null) {
        get.headers(header)
    }
    if (isUseCache) {
        get.cacheMode(CacheMode.IF_NONE_CACHE_REQUEST)
        get.cacheKey(url)
        get.cacheTime(TimeUnit.HOURS.toMillis(2))//两个小时
    }
    get.execute(object : JsonCallback(type) {
        override fun onSuccess(response: Response?) {
            if (response != null && response.isSuccessful) {
                it.resume(response.body())
            } else {
                it.resumeWithException(IllegalStateException("NetWork error"))
            }
        }

        override fun onCacheSuccess(response: Response?) {
            if (response != null && response.isSuccessful) {
                it.resume(response.body())
            } else {
                it.resumeWithException(IllegalStateException("NetWork error"))
            }
        }

        override fun onError(response: Response?) {
            super.onError(response)
            it.resumeWithException(IllegalStateException("NetWork error"))
        }
    })
}

你可能感兴趣的:(协程的简单使用)