当前位置: 首页 > news >正文

白鹭引擎可以做网站吗哈尔滨最新疫情

白鹭引擎可以做网站吗,哈尔滨最新疫情,wordpress googlevis 嵌入,电商网站可以用dw做Kotlin的重要优势及特点之——结构化并发 Kotlin 协程是一种并发设计模式,可以在 Android 平台上让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。 简单来说,协程就是一种轻量级的非…

Kotlin的重要优势及特点之——结构化并发

Kotlin 协程是一种并发设计模式,可以在 Android 平台上让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。

简单来说,协程就是一种轻量级的非阻塞的线程工具API,可以用同步的方式写出异步的代码,优雅地切换线程和处理回调地狱。与线程的关系,线程在进程中,协程在线程中。

所有源文件都必须编码为 UTF-8。

来源标注:Android 上的 Kotlin 协程  |  Android Developers

书接上篇:Android Kotlin知识汇总(三)Kotlin 协程-CSDN博客


示例概览

根据应用架构指南,本主题中的示例会发出网络请求并将结果返回到主线程,然后应用可以在主线程上向用户显示结果。

具体而言,ViewModel 架构组件会在主线程上调用代码库层,以触发网络请求。ViewModel 包含一组可直接与协程配合使用的 KTX 扩展(lifecycle-viewmodel-ktx 库)。

依赖项信息

如需在 Android 项目中使用协程,请将以下依赖项添加到应用的 build.gradle 文件中:

dependencies {implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9")
}

Repository 类

创建LoginRepository类,其中makeLoginRequest方法是同步的,并且会阻塞发起调用的线程。为了对网络请求的响应建模,我们创建了自己的 Result 类。 

sealed class Result<out R> {data class Success<out T>(val data: T) : Result<T>()data class Error(val exception: Exception) : Result<Nothing>()
}class LoginRepository(private val responseParser: LoginResponseParser) {private const val loginUrl = "https://example.com/login"fun makeLoginRequest(jsonBody: String): Result<LoginResponse> {//IO操作val url = URL(loginUrl)(url.openConnection() as? HttpURLConnection)?.run {requestMethod = "POST"setRequestProperty("Content-Type", "application/json; utf-8")setRequestProperty("Accept", "application/json")doOutput = trueoutputStream.write(jsonBody.toByteArray())return Result.Success(responseParser.parse(inputStream))}return Result.Error(Exception("Cannot open HttpURLConnection"))}
}

ViewModel类

用于在点击登陆(例如,点击按钮)时触发网络请求: 

class LoginViewModel(private val loginRepository: LoginRepository): ViewModel() {fun login(username: String, token: String) {val jsonBody = "{ username: \"$username\", token: \"$token\"}"loginRepository.makeLoginRequest(jsonBody)}
}

使用上述代码,LoginViewModel 会在网络请求发出时阻塞UI线程。如需将执行操作移出主线程,最简单的方法是创建一个新的协程,然后在 I/O 线程上执行网络请求: 

class LoginViewModel(private val loginRepository: LoginRepository): ViewModel() {fun login(username: String, token: String) {// 创建并开启一个 coroutine 协程viewModelScope.launch(Dispatchers.IO) {val jsonBody = "{ username: \"$username\", token: \"$token\"}"loginRepository.makeLoginRequest(jsonBody)}}
}

        由于此协程通过 viewModelScope 启动,因此在 ViewModel 的作用域内执行。如果 ViewModel 因用户离开屏幕而被销毁,则 viewModelScope 会自动取消,且所有运行的协程也会被取消。

使用协程确保主线程安全

makeLoginRequest 函数不是主线程安全的,因为从主线程调用 makeLoginRequest 确实会阻塞界面。可以使用协程库中的 withContext() 函数将协程的执行操作移至其他线程:

class LoginRepository(...) {...suspend fun makeLoginRequest(jsonBody: String): Result<LoginResponse> {return withContext(Dispatchers.IO) {//IO操作...}}
}

makeLoginRequest 用 suspend 关键字进行标记,强制从协程内调用函数。 

class LoginViewModel(private val loginRepository: LoginRepository): ViewModel() {fun login(username: String, token: String) {// Create a new coroutine on the UI threadviewModelScope.launch {val jsonBody = "{ username: \"$username\", token: \"$token\"}"val result = loginRepository.makeLoginRequest(jsonBody)when (result) {is Result.Success<LoginResponse> -> else -> // Show error in UI}}}
}

 makeLoginRequest 是一个 suspend 函数,而所有 suspend 函数都必须在协程中执行。launch 不接受 Dispatchers.IO 参数。则从 viewModelScope 启动的所有协程都会在主线程中运行。后续可以处理网络请求的结果,以显示成功或失败界面。

处理异常

为了处理 Repository 层可能抛出的异常,请使用 Kotlin 对异常的内置支持。在以下示例中,我们使用的是 try-catch 块:

class LoginViewModel(private val loginRepository: LoginRepository): ViewModel() {fun login(username: String, token: String) {viewModelScope.launch {val jsonBody = "{ username: \"$username\", token: \"$token\"}"val result = try {loginRepository.makeLoginRequest(jsonBody)} catch(e: Exception) {Result.Error(Exception("Network request failed"))}...}}
}

在此示例中,makeLoginRequest() 调用抛出的任何意外异常都会处理为界面错误。 

http://www.wangmingla.cn/news/71944.html

相关文章:

  • 创建公司网站需要准备哪些素材seo顾问合同
  • seo网站营销推广全...广州营销网站建设靠谱
  • 吴江区建设局网站优化关键词是什么意思
  • 广州番禺网站制快速提高关键词排名的软件
  • 网站建设柒首先金手指7网店运营与推广
  • 商务网站开发的测试报告seo免费培训
  • 网站建设面试自我介绍广告主广告商对接平台
  • 徐州网站开发公司电话搜狗网址大全
  • 南宁网站建设哪如何做网页设计
  • 启铭网站建设app营销策划方案
  • 网站和ip建设中国十大策划公司排名
  • 做网站推广优化靠谱企业seo顾问公司
  • 北京专业网站建设公司排名沈阳关键词优化价格
  • 网站备案ip查询网站查询如何用html制作网页
  • 梅州头条新闻今天头条新闻深圳整站seo
  • 编程 毕业设计代做网站站长工具手机综合查询
  • 最好大连网站建设成都网站制作设计公司
  • 绵阳网站维护托管网络公司取什么名字好
  • 建设银行官方网站广州百度推广开户费用
  • 西安市建设厅网站软文推广公司
  • 网站 系统设置抖音流量推广神器软件
  • wordpress评论等级seo是什么意思蜘蛛屯
  • 主机如何做网站空间网站改版公司哪家好
  • 网站建设遵循的原则营销软文范例大全100
  • 音乐网站怎么做全网整合营销
  • 互联网信息服务平台入口多合一seo插件破解版
  • vs网站开发源码品牌推广宣传词
  • 电影网站虚拟主机和vps搜索引擎排名规则
  • 丰台深圳网站建设公司网络营销策划包括哪些内容
  • 温州网站定制百度快速收录技术