viewModelScope 未取消

2024-01-12

看完后Sean 对 Android 的解释 (Google I/O'19) https://youtu.be/BOHK_w09pVA?t=1425我也尝试过同样的操作:

init{
    viewModelScope.launch {
        Timber.i("coroutine awake")
        while (true){
            delay(2_000)
            Timber.i("another round trip")
        }
    }
}

很遗憾onCleared当活动被杀死时会调用它,但当它被放入后台时不会调用它(“当我们离开活动时......”,背景是“移开”恕我直言^^)。
我得到以下输出:

> ---- Activity in Foreground
> 12:41:10.195  TEST: coroutine awake
> 12:41:12.215  TEST: another round trip
> 12:41:14.231  TEST: another round trip
> 12:41:16.245  TEST: another round trip
> 12:41:18.259  TEST: another round trip
> 12:41:20.270  TEST: another round trip
> ----- Activity in Background (on onCleared not fired)
> 12:41:22.283  TEST: another round trip
> 12:41:24.303  TEST: another round trip
> 12:41:26.320  TEST: another round trip
> 12:41:28.353  TEST: another round trip
> 12:41:30.361  TEST: another round trip
> ----- Activity in Foreground
> 12:41:30.369  TEST: coroutine awake

我该如何解决这个问题?

1 - 将代码从init to a suspend fun start()由 a 内的活动调用lifecycleScope.launchWhenStarted?

我得到同样的结果。我想lifecycleScope当它进入后台时会取消它的子协程,但我用这种方法得到了相同的 Timber 输出。

2 - 将我的 ViewModel 代码更改为:

private lateinit var job: Job

suspend fun startEmitting() {
    job = viewModelScope.launch {
        Timber.i("coroutine awake")
        while (true){
            delay(2_000)
            Timber.i("another round trip")
        }
    }
}
fun cancelJob(){
    if(job.isActive){
        job.cancel()
    }
}

并且,在我的活动中:

override fun onResume() {
    super.onResume()
    lifecycleScope.launch {
        viewModel.startEmitting()
    }
}
override fun onPause() {
    super.onPause()
    viewModel.cancelJob()
}

嗯,它有效,但不是viewModelScope目的是为了管理CoroutineScope为我?我讨厌这个 cancelJob 逻辑。

处理这个问题的最佳方法是什么?


Kotlin 无法为您取消无限操作。你需要打电话isActive某处。例如:while(isActive).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

viewModelScope 未取消 的相关文章

  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • 按下按钮时应用不同的样式

    有没有办法在按下按钮时将样式应用于按钮 如果我有一种风格样式 xml
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • Android:后台Activity可以执行代码吗?

    后台的活动是否被视为 正在运行 并且可以执行代码 还是处于挂起状态 他们暂停了 活动生命周期 http developer android com reference android app Activity html ActivityLi
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 在 Android 应用程序资源中使用 JSON 文件

    假设我的应用程序的原始资源文件夹中有一个包含 JSON 内容的文件 我如何将其读入应用程序 以便我可以解析 JSON See 开放原始资源 http developer android com reference android conte
  • 发布的 Android apk 出现错误“包文件未正确签名”

    我最近将我的应用程序上传到 Android 市场 但是由于错误 下载时它拒绝运行 包文件未正确签名 我首先使用 eclipse 发布了数据包 右键单击导出 创建密钥库然后发布 但它拒绝工作 然后我下载了 keytool 和 jarsigne

随机推荐

  • 如何检查双精度数是否可以放入浮点数而不转换为无穷大

    是否有一种标准方法来检查 64 位浮点数是否可以转换为 32 位浮点数而不转换为 Infinity 我知道事后可以检查 Inf Convert ToSingle 不会这样做 为了测试是否double value d将转换为float在不产生
  • 如何强制 PhpMailer 5.2 使用 TLS 1.2

    最近我使用的第三方电子邮件服务提供商发生了变化 他们禁用了对 TLS 1 0 和 TLS 1 1 的支持 我为仍然使用 php 5 3 和 phpmailer 5 2 的古老系统提供支持 我的测试表明 TLS 1 2 已启用 但是 禁用 T
  • 使用带有自定义键的 HashMap

    快速问题 如果我想使用HashMap以自定义类为键 must我覆盖hashCode功能 如果我不重写该函数 它将如何工作 如果您不覆盖 hashCode AND equals 您将获得默认行为 即每个对象都是不同的 无论其内容如何
  • WF4 InstancePersistenceCommand 中断

    我有一个 Windows 服务 正在运行工作流程 工作流程是从数据库加载的 XAML 用户可以使用重新托管的设计器定义自己的工作流程 它配置有一个 SQLWorkflowInstanceStore 实例 以便在空闲时保留工作流 它基本上源自
  • 有什么方法可以判断任意 .docx 文件是否采用 Strict Office Open XML 格式与过渡格式? (ECMA-376)

    我在网上搜索过 没有找到任何程序或工具可以区分那些编码为严格 ECMA 376 和非严格 ECMA 376 的 docx 文件 对于 xlsx 文件也是如此 大多数讨论都集中在给定应用程序支持哪些格式 例如LibreOffice 但不知道如
  • 一起录制视频和屏幕并用 Javascript 覆盖

    我想在网络摄像头旁边记录用户的屏幕并将结果显示为叠加层 如下所示 我假设在录制时我可以在两个单独的视频元素中显示多个流并用 CSS 覆盖它们 然而 我该如何save结果是两个视频的叠加 这可以在纯 JS 中实现 如下所示 通过 getUse
  • 为什么建议在 .NET 中使用反射?

    使用它绝对是一个好的做法吗 项目中有哪些可能的情况需要反思 反射的主要价值在于它可用于检查程序集 类型和成员 它是一个非常强大的工具 用于确定未知程序集或对象的内容 并且可用于多种情况 Reflection 的反对者会说它很慢 与静态代码执
  • 延迟函数不恢复

    所以 我一直在摆弄go 我发现下面的函数恢复成功 package main import fmt func a defer func if r recover r nil fmt Println Recovered r n int 5 7
  • 如何修复 Laravel 应用程序找不到 nginx 404?

    我所有的路线都得到了404未找到 如果我访问 我可以打开 Laravel 页面localhost mylaravel 但如果我访问localhost mylaravel login 我得到 404 未找到页面 如果我更改 home 上的回家
  • Login-AzureRmAccount 返回订阅,但 Get-AzureSubscription 返回空

    我能够成功登录Login AzureRmAccount 我还可以在 Login AzureRmAccount 的返回值中看到我的订阅 但登录后 如果我输入Get AzureSubscription它返回空 找到下面的截图 嗯 你需要使用Ge
  • 如何向android studio添加外部依赖(jar文件)?

    我正在尝试将外部库 httpmime 4 0 sources jar 添加到 android 项目中 因为 android studio 弹出如下错误 error 包 org apache http entity mime 不存在 erro
  • Microsoft UI 自动化的 Python 绑定? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道 Microsoft UI 自动化的 Python 绑定吗 http msdn microso
  • Flutter:如何避免在现有路由上推送相同的路由

    我有带有底部导航栏的视图 当您按下导航栏项目时 一条新路线将被推入视图中 final navigatorKey GlobalKey
  • Azure B2C:检查本地帐户创建期间是否存在另一个声明

    除了通常根据所使用的电子邮件当前是否存在创建帐户之外 我想知道如何检查 Azure Active Directory 中是否不存在另一个声明值 例如 对于我们的应用程序 创建帐户的任何人都必须提供组织名称 一旦他们注册 他们就是其组织群组的
  • 如何使用 Selenium 和 Python 更改用户代理

    我在使用 selenium 更改 Python 中的 Web 驱动程序用户代理时遇到错误 这是我的代码 import requests import json from selenium import webdriver from sele
  • Vector3 不可序列化 Unity3D

    好吧 我按照 Unity3D 数据持久化教程进行操作 一切都很顺利 直到我尝试保存 Vector3 类型的数据 本教程仅展示如何保存 int 和 string 当我使用函数 Save 时 控制台向我显示says SerializationE
  • 使用 REST API 的可编辑 jQuery 网格推荐

    首先 我已经读过这个问题 jQuery 网格建议 https stackoverflow com questions 159025 jquery grid recommendations 但这并不能回答我的问题 我有一个小带有 MongoD
  • 带指数的浮点文字的类型

    具有指数部分的浮点文字是什么类型 例如123456e 3在 C 99 中 是否属于类型float or double 当用作float初始化程序在float f 123456e 3 是否需要有一个f suffix 默认情况下 所有浮点文字
  • 节点Hmac认证

    我对认证过程的理解 主机创建一个secret and a public api key 客户端借助密钥对有效负载进行加密 这就是签名 然后将其公钥 有效负载 签名发送给主机 示例客户端 https github com bitfinexco
  • viewModelScope 未取消

    看完后Sean 对 Android 的解释 Google I O 19 https youtu be BOHK w09pVA t 1425我也尝试过同样的操作 init viewModelScope launch Timber i coro