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

龙口建网站价格广东省农业农村厅网站

龙口建网站价格,广东省农业农村厅网站,网站开发的服务,wordpress绝对域名更改文章目录 前言1、导入依赖2、使用协程获取服务器中的数据2.1 定义请求回调结果的数据类2.2 网络请求 3、网络回调结构4、通过ViewModel处理网络请求数据 前言 在使用协程的时候一直没有一个具体的概念#xff0c;只知道协程能够使得异步操作等同于同步操作#xff0c;且不会… 文章目录 前言1、导入依赖2、使用协程获取服务器中的数据2.1 定义请求回调结果的数据类2.2 网络请求 3、网络回调结构4、通过ViewModel处理网络请求数据 前言 在使用协程的时候一直没有一个具体的概念只知道协程能够使得异步操作等同于同步操作且不会造成线程阻塞且第一次使用协程是根据前辈的代码修改而学会的没有一个规范性的思维通过查看官方资料将协程的使用重新梳理一遍一个简单不麻烦的做法。 1、导入依赖 选择依赖的方式主要分为两种查看创建项目的时候中Build configuration language的选项选择的某一项根据项目来选择 Groovy dependencies {implementation org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9 }kotlin dependencies {implementation(org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9) }2、使用协程获取服务器中的数据 目的 防止直接在UI线程中进行网络请求出现线程阻塞导致应用程序无响应ANR Dispatchers.IO 用于执行I/O操作如读写文件、访问数据库等。 这个调度器会尝试在后台线程池中执行I/O密集型任务从而避免阻塞主线程。 Dispatchers.Main 用于在Android的主线程UI线程上执行协程。 这个调度器确保与UI相关的操作如更新UI元素在主线程上执行。 在非Android平台上如桌面应用或纯Kotlin项目Dispatchers.Main 可能不可用或行为不同。 Dispatchers.Default 用于执行计算密集型任务。可用于执行网络请求获取服务器数据 这个调度器使用共享的后台线程池来执行协程从而优化CPU资源的利用。 它是默认的调度器如果你没有为协程指定调度器那么它将使用 Dispatchers.Default。 Dispatchers.Unconfined 不绑定到任何特定的线程。 协程在哪个线程上启动它就会在那个线程上继续执行直到遇到挂起点如 suspend 函数调用。 一旦协程挂起并恢复它可能会在任何线程上继续执行这取决于挂起函数的实现。 通常不建议在生产代码中使用 Dispatchers.Unconfined因为它可能导致难以追踪的线程安全问题。 用法 // 创建一个协程作用域通常是在ViewModel、Activity或Fragment中 val coroutineScope CoroutineScope(SupervisorJob() Dispatchers.IO)// 在协程作用域中启动一个协程 coroutineScope.launch(Dispatchers.IO) {// 执行I/O操作 }2.1 定义请求回调结果的数据类 sealed 关键字 sealed 关键字用于定义一个密封类sealed class用于控制子类的个数只接受子类在密封类的同一个文件中声明或者作为密封类的嵌套类。 有助于改进when表达式当使用密封类的时候编译器会确保when表达式覆盖所有可能得子类如果没有覆盖的话则会出现报错的提醒这有助于提高代码的健壮性和可维护性。 sealed class Resultout R {data class Successout T(val data: T) : ResultT()data class Error(val exception: Exception) : ResultNothing() }2.2 网络请求 为了防止主线程调用 makeLoginRequest 后出现阻塞界面情况。可以使用协程库中的 withContext() 函数将协程的执行操作移至其他线程在其中执行耗时的网络请求操作 class LoginRepository(private val responseParser: LoginResponseParser) {private const val loginUrl https://example.com/loginsuspend fun makeLoginRequest(jsonBody: String): ResultLoginResponse {return withContext(Dispatchers.IO) {// Blocking network request codeval url URL(loginUrl)(url.openConnection() as? HttpURLConnection)?.run {requestMethod POSTsetRequestProperty(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))}} }3、网络回调结构 假设请求回调的结构为 {success: true,user: {id: 123,username: exampleUser,email: exampleexample.com},token: some_jwt_token}为了适配并处理网络请求回调的数据需要创建数据类方便适配回调数据。 data class User(val id: Int,val username: String,val email: String )data class LoginResponse(val success: Boolean,val user: User?,val token: String? )将网络请求返回的InoutStream通过LoginResponseParser 处理读取返回的数据并进行处理转为LoginResponse的数据。 import com.google.gson.Gson import com.google.gson.JsonSyntaxException import java.io.BufferedReader import java.io.InputStream import java.io.InputStreamReaderobject LoginResponseParser {private val gson Gson()Throws(JsonSyntaxException::class)fun parse(inputStream: InputStream): LoginResponse {return try {// 使用try-with-resources语句自动关闭BufferedReadergson.fromJson(BufferedReader(InputStreamReader(inputStream)).use {it.readText()}, LoginResponse::class.java)} catch (e: IOException) {// 处理IOException例如记录日志或抛出运行时异常throw RuntimeException(Failed to read input stream, e)} catch (e: JsonSyntaxException) {// 处理JsonSyntaxException例如记录日志或抛出运行时异常throw RuntimeException(Failed to parse JSON, e)}} }4、通过ViewModel处理网络请求数据 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))}when (result) {is Result.SuccessLoginResponse - // Happy pathelse - Result.Error(Exception(reponse is error))// Show error in UI}}} }想要了解更多协程相关的知识点可以查看官网
http://www.hkea.cn/news/14478704/

相关文章:

  • 网站开发公司有什么福利网站关键词用什么隔开
  • 温江网站建设价格给朋友网站做宣传怎么写
  • 网站分析总结wordpress压缩缩略图体积
  • 江苏水利厅建设网站企业网站建设套餐 网络服务
  • 北京微网站制作外贸怎么找客户资源
  • 做网站软件A开头的鞍山吧 百度贴吧
  • 博客网站模板下载物联网应用技术学什么
  • 广东东莞免费网站制作公司希爱力双效片
  • 吉林长春建设工程信息网站济南网站建设选搜点网络
  • custed谁做的网站如何建设网站内容
  • 技术支持 嘉兴网站建设漂亮html个人简历代码
  • 学网站建设需要几年财务软件排名
  • 连云港建设工程安全网站企业网站优化方式
  • 外贸免费p2p网站建设一个人做网站需要多久
  • 网站制作毕业设计相亲网站上做投资的女生
  • 聊城网站建设有限公司无锡网站策划
  • 法拍重庆网站室内装修工人培训学校
  • 外贸建站及推广为网站网站做代理被判缓刑
  • 光明附近网站建设公司wordpress点击文章在新页面打开
  • 网站建设平台计划书移动网站设计上机考试
  • 如何做商业网站推广做js链接的网站要加证书吗
  • 建设网站的注意事项网站建设售后服务安全维护
  • 网站备案 在哪里上海建筑设计公司排名前20
  • 优品惠网站建设需求泉港区住房和城乡规划建设局网站
  • 网站安全建设模板下载怎么进入网络管理系统
  • 龙华网站设计公司沂南网站建设
  • 官方网站建设的四个步骤湖南知名网络推广公司
  • 医药电子商务网站建设汽车之家在线官网
  • 遵义 网站建设东莞网站建设 鞋材厂
  • 西安市网站建设公司wordpress怎么登陆地址