【Kotlin 协程】协程底层实现 ④ ( 结构化并发 | viewModelScope 作用域示例 )

news2025/2/26 6:33:21

文章目录

  • 一、viewModelScope 作用域作用
  • 二、viewModelScope 作用域示例


常见的 CoroutineScope 协程作用域 :

  • GlobalScope : 该作用域是 进程级别的 , 与应用进程同级 , 即使 Activity 被销毁 , 协程任务也可以继续执行 ;
  • MainScope :作用域仅在 Activty 中 , 如果 Activity 被销毁 , 则 在 onDestory 生命周期函数中取消协程任务 ;
  • viewModelScope : 该作用与仅在 ViewModel 中使用 , 与 ViewModel 生命周期绑定 ;
  • lifecycleScope : 该作用与仅在 Activity 中使用 , 与 Activity 生命周期绑定 ;




一、viewModelScope 作用域作用



viewModelScope 协程作用域 需要绑定 ViewModel 生命周期 , 在特定界面中 , 如可旋转屏幕的 Activity 界面中 , 如果使用 MainScope 协程作用域 , 当屏幕旋转时 , 就会在 onDestory 生命周期函数中 取消协程作用域 , 此时协程相关的临时数据都被取消了 ;

当旋转 Activity 界面时 , 会调用当前 Activity 的 onDestory 生命周期函数 , 自然对应的协程作用域也会被取消 , 因此引入 viewModelScope 作用域 , 避免协程临时数据被销毁 ;





二、viewModelScope 作用域示例



项目地址 :

  • https://github.com/han1202012/Coroutine
  • https://download.csdn.net/download/han1202012/87173470

在 Module 模块下的 build.gradle 中

  • 导入 kotlin-kapt 插件 ;
  • 启用 DataBinding , 在 build.gradle # android 层级下配置 dataBinding { enabled = true } 即可 , 配置效果如下 :
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
}

android {
    defaultConfig {
        applicationId "kim.hsl.coroutine"
    }
    
    dataBinding {
        enabled = true
    }
}

在 布局文件 中 , 选中根组件 , 一般是 androidx.constraintlayout.widget.ConstraintLayout 组件 , 如 :

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <!-- 布局主要内容 -->

</androidx.constraintlayout.widget.ConstraintLayout>

使用 " Alt + 回车 " 快捷键 , 弹出如下下拉菜单 ,

在这里插入图片描述
选择菜单中的 " Convert to data binding layout " 选项 , UI 布局会变成如下格式 :

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
		<!-- 布局主要内容 -->

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

设置完毕后 , 先构建应用 , Android Studio 中选择 " 菜单栏 | Build | Make Project " 选项 , 或者使用 " Ctrl + F9 " 快捷键 , 首先要编译生成相关数据绑定类 ;

MainActivity 代码 :

package kim.hsl.coroutine

import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import kim.hsl.coroutine.databinding.ActivityMainBinding


class MainActivity : AppCompatActivity(){

    private val mainViewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 设置布局文件
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this,R.layout.activity_main)

        // 设置数据源
        binding.viewmodel = mainViewModel

        // 设置声明周期管理器
        binding.lifecycleOwner = this

        // 设置点击事件
        binding.button.setOnClickListener {
            // 更新 mainViewModel 数据
            mainViewModel.setStudentData()
        }
    }
}

ViewModel 代码 :

package kim.hsl.coroutine

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch

class MainViewModel() : ViewModel() {
    // 在布局文件中配置的属性
    val student = MutableLiveData<Student>()

    // 该方法用于刷新数据
    fun setStudentData() {
        viewModelScope.launch {
            student.value = Student("Tom", 18)
        }
    }
}

data class Student(val name: String, val age: Int)

布局文件代码 :

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="viewmodel"
            type="kim.hsl.coroutine.MainViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewmodel.student.name}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.2"
            app:layout_constraintHorizontal_bias="0.5" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

项目地址 :

  • https://github.com/han1202012/Coroutine
  • https://download.csdn.net/download/han1202012/87173470

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VuePress构建一个文档管理网站

序言 目前无论笔记还是项目文档&#xff0c;大部分我都会通过 Markdown来记录&#xff0c;并且大部分文档写完都只存在自己电脑上&#xff0c;每次查找起来都需要耗费一些时间 自己的写的一部分技术教程由于初次记录时了解知识不多&#xff0c;内容存在偏差或考虑不全面&…

数仓搭建-ODS层

数仓搭建-ODS层 1&#xff09;保持数据原貌不做任何修改&#xff0c;起到备份数据的作用。 2&#xff09;数据采用LZO压缩&#xff0c;减少磁盘存储空间。100G数据可以压缩到10G以内。 3&#xff09;创建分区表&#xff0c;防止后续的全表扫描&#xff0c;在企业开发中大量使用…

ILRuntime使用指南

前言 最近闲着没事做&#xff0c;于是用ILRuntime做了一个小游戏中间遇到一些坑&#xff0c;对于ILRuntime的认识更清楚了。其它技巧自动转换DLL 设置引用文件夹 我们在热更项目里面写代码的时候需要用到Unity的DLL&#xff0c;可是这些DLL引用起来查找就很麻烦。这时候可以…

带你了解LINUX反弹Shell的各种姿势(超详细)

简介 LInux反弹Shell(Reveser Shell), 也可以称为反向Shell, 由被控制端主动向控制端发送请求建立通讯, 随后将执行命令的结果输出到控制端, 本质上是网络概念的客户端与服务端的角色反转 本篇文章介绍LINUX反弹Shell的多种姿势, 在真实的渗透环境中, 根据客户端存在哪些命令…

深度学习求解微分方程系列四:一种基于自适应激活函数的PINN求解方法—burger方程逆问题

下面我将介绍内嵌物理知识神经网络&#xff08;PINN&#xff09;求解微分方程。首先介绍PINN基本方法&#xff0c;并基于自适应激活函数的PINN求解框架利用Pytorch实现求解含时间项的一维burger方程逆问题。 内嵌物理知识神经网络&#xff08;PINN&#xff09;入门及相关论文 深…

视频怎么消除人声?一款视频去人声软件,轻松去除视频人声

视频消除人声是一个优质的视频文件必须经历的步骤。当前&#xff0c;分享视频的用户越来越多&#xff0c;只有原创且有亮点的视频才能更吸引人。但是很多时候自己录制的原创视频总是有各种声音&#xff0c;所以很难制作出一个好的视频&#xff0c;获得更多的关注。 那视频怎么消…

制霸GitHub热榜的Spring Cloud Alibaba源码笔记,果然是阿里传出的

7年前面试最常问的并且可以顺利拿到高薪的技能是 Dubbo 3年前面试,只要你简历上有Spring Cloud 项目的相关经验,肯定会打动面试官&#xff0c;现在呢?恐怕简历上有Dubbo和简单的Spring Cloud技术和经验是无法让面试官高看你的。 Spring Cloud Alibaba 近几年在受到国内不少开…

我们都有光明的前途·OI 生涯回忆录

挺震撼的&#xff0c;不知不觉&#xff0c;我就从一个什么也不懂的萌新&#xff0c;成长为一个能够独立思考的普通 OIer&#xff0c;直到不得不面对眼前的退役生活了。 近四年半的时间&#xff0c;我在洛谷、CodeForces、Atcode、Uoj、Loj 等各大网站都有做题记录&#xff0c;重…

ST-link/V2引脚定义和更新固件说明

LED状态说明 闪烁红色&#xff1a;ST-LINK/V2连接到计算机后&#xff0c;第一次USB枚举过程 红色&#xff1a;ST-LINK/V2与计算机已建立连接 闪烁绿色/红色&#xff1a;目标板和计算机在进行数据交换 绿色&#xff1a;通讯完成 橙色&#xff08;红色绿色&#xff09;&#xff1…

iwebsec靶场 SQL注入漏洞通关笔记5- updatexml注入(报错型盲注)

系列文章目录 iwebsec靶场 SQL注入漏洞通关笔记1- 数字型注入_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记2- 字符型注入&#xff08;宽字节注入&#xff09;_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记3- bool注入&#xff08;布尔型盲注&#…

Verilog 时序检查

setup hold recovery removal width period 指定路径延迟&#xff0c;目的是让仿真的时序更加接近实际数字电路的时序。利用时序约束对数字设计进行时序仿真&#xff0c;检查设计是否存在违反&#xff08;violation&#xff09;时序约束的地方&#xff0c;…

鲲鹏devkit开发套件——编译调试工具介绍

鲲鹏devkit编译调试工具介绍 编译调试插件是其中的一个子工具。编译调试插件即插即用&#xff0c;支持一键安装服务器鲲鹏编译器&#xff0c;支持单机下Nvidia GPU应用调试能力&#xff0c;通过统一调试界面调试GPU应用&#xff0c;实现cuda-gdb调试能力&#xff0c;以及鲲鹏平…

Spring Security 使用JSON格式参数登录的两种方式

前言 在 Spring Security 中&#xff0c;默认的登陆方式是以表单形式进行提交参数的。可以参考前面的几篇文章&#xff0c;但是在前后端分离的项目&#xff0c;前后端都是以 JSON 形式交互的。一般不会使用表单形式提交参数。所以&#xff0c;在 Spring Security 中如果要使用…

python3-turtle(1)

turtle 是海龟绘图模块&#xff0c;海龟绘图很适合用来引导孩子学习编程&#xff0c;最初构想来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言&#xff0c;它是基于tkinter 模块打造&#xff0c;提供简单的绘图方法。 turtle模块假…

集合框架----源码解读ArrayList篇

1.ArrayList<E> ArrayList是继承AbstractList<E> List 接口的可调整数组实现。实现所有可选的列表操作&#xff0c;并允许所有元素&#xff0c;包括null。除了实现List接口之外&#xff0c;该类还提供了一些方法来操作内部用于存储列表的数组的大小。(这个类大致相…

准备蓝桥杯的宝贝们看过来,二分法一网打尽(基础篇)

今天给大家介绍一下简单的二分法&#xff08;刷题第一步&#xff01;&#xff09; 二分基础题链接 二分查找有个很明显的特点就是有序&#xff0c;这个特点同学如果在题中看到就要格外注意 一定要看完&#xff0c;基本的三种解法&#xff0c;后面还有真题链接哦&#xff01;…

异步请求-AJAX

什么是同步交互 首先用户向HTTP服务器提交一个处理请求。接着服务器端接收到请求后&#xff0c;按照预先编写好的程序中的业务逻辑进行处理&#xff0c;比如和数据库服务器进行数据信息交换。最后&#xff0c;服务器对请求进行响应&#xff0c;将结果返回给客户端&#xff0c;返…

TCP三次握手与四次挥手

TCP三次握手的建立与四次挥手的过程 TCP协议 TCP 用于处理实时通信TCP是基于端口&#xff0c;面向连接的传输层协议TCP的握手和挥手本质上都是四次&#xff0c;只不过握手合并成三次。因为主机之间要想通信需要先建立双向数据通道TCP的主要特点是传输稳定性高&#xff0c;但是…

[自建题库]c认证初级

UTF-8的编码实现方式有几种? UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4 二进制数1111.1111转换成十进制数是多少&#xff1f; 如果二进制数字“1000111______”采取偶校验&#xff0c;那么下划线的校验位处应该填什么&#xff1f; 0 在MPEG-4中&#xff0c;第九部分定义了IP网络传…

JS高级-语言特性(持续更新一)

JS高级-语言特性 JS高级-语言特性 一、JS面向对象编程 1.1面向对象介绍 1.2面向对象编程 1.3创建对象 二、构造函数 2.1构造函数 2.2构造函数存在的问题 三、原型 3.1构造函数的prototype属性 3.2构造函数、实例、原型三者之间的关系 3.3原型对象的获取及修改 3.4原…