可以将sharedPrefrence与Coroutine kotlin一起使用吗

2024-04-30

我已经注射了sharedPreference in ViewModel.

我可以在嵌入 Coroutine 作用域时使用 Android 特定资源吗?当 ViewModel 失去作用域时,Coroutine 作用域会自动挂起。

我的意思是,如果我们添加 viewModel 启动范围,可以在 ViewModel 中使用preferende吗?

CoroutineScope 会跟踪它创建的所有协程。因此,如果取消一个作用域,就会取消它创建的所有协程

@ContributesViewModel
class SplashViewModel @Inject constructor(private val prefs: PrefStore) : BaseViewModel() {

    val onMoveToNext = ClassLiveData()

    init {
        scope.launch {
            val activity = if(prefs.isLoggedIn()) HomeActivity::class
            else OnBoardingActivity::class
            onMoveToNext.postValue(activity)
        }
    }

    ///fun saveDeviceID(id:String) = prefs.setDeviceID(id)
    //fun createErrorCodeHash() ={}

    fun getIsLoggedIn():Boolean = prefs.isLoggedIn()

    fun setSecondTimeLogin(boolean: Boolean) = prefs.setIsSecondTimeLogin(boolean)
}

Where

abstract class BaseViewModel: ViewModel() {

    private val job = Job()
    val scope = CoroutineScope(Dispatchers.IO + job)

    override fun onCleared() {
        super.onCleared()
        job.cancel()
    }

}

类实时数据在哪里

typealias ClassLiveData = MutableLiveData<KClass<*>>

并在SplashActivity中调用它

viewModel.onMoveToNext.listen(this) {
    Handler().postDelayed({
         val intent = Intent(this, it.java)
        intent.putExtra("Role", "LOGIN")
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
        startActivity(intent)
    }, 2000)

作为一般经验法则,当涉及到保留对context或其他有硬引用的对象context (e.g. ContextWrapper,这就是哪里SharedPrefferences来自),人们应该将协程视为与经典线程相同。

例如,一个实时协程Dispathers.IO 可能可以泄漏context就像经典一样thread, AsyncTasks等等。因此,管理这些引用并清理它们是开发人员的责任。

回顾你的代码,你的基础ViewModel正在研究IO范围,这意味着任何空构造函数luanches,在同一个范围上创建一个子范围Dispatcher, i.e IO。然而因为你的ViewModel.onCleared():

override fun onCleared() {
        super.onCleared()
        job.cancel()
    }

you are 差不多 safe.

为什么我说“差不多”?

因为这取决于你如何实施你的launches.请记住,仅取消job并不一定意味着相应的协程已关闭并且每个引用都被删除。某些实现需要您直接检查范围内作业的状态并进行手动清理:

例如,如果您在协程内创建 while 循环,job.cancel() 不会破坏它, 你需要break手动进行。

最后一次回顾你的代码,你没有在你的代码中做任何事情launch这需要手动清理。那么,我们可以说你当前的代码肯定不会泄漏context.

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

可以将sharedPrefrence与Coroutine kotlin一起使用吗 的相关文章

  • Kapt 未在即时应用程序功能模块中生成类

    我在我的 Android 应用程序中使用 dagger2 即使没有错误 它也不会生成匕首组件类 我已经在设置中启用了注释处理器并重新启动了我的 android studio 但这对我来说不起作用 我也读过这个帖子Dagger2 不生成 Da
  • startActivity overridePendingTransition 只显示进入动画

    基本上 我遇到的问题是只显示输入幻灯片动画 调用 Activity 不会产生动画 startActivity intent overridePendingTransition R anim right in partly R anim le
  • Google Play 商店中基于服务的 Android 应用程序

    我正在开发一个应用程序 该应用程序仅包含一些服务 没有任何活动 即没有 UI 基本上 当用户在他 她的设备上安装应用程序时 我希望有 2 到 3 个服务在后台运行 对此我有几个疑问 应用程序安装后我的服务将如何启动 我的BroadcastR
  • OPENGL ES 不工作:无当前上下文

    我尝试了 OpenGL ES2 for Android 一书中所示的程序 但它不起作用 我已经在Odroid E 三星s3 三星y 三星star上进行了测试 the gl version suported returns 2 but i g
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • 如何忽略 LeakCanary 中的某些类?

    有人能给我一个如何忽略 LeakCanary 中的某些类的有效示例吗 我正在查看这个示例 以忽略 LeakCanary 中第三方库中的某些类 但我不知道将其放在应用程序中的何处 我把它放在我的应用程序类中 但这些变量和方法有错误 isInA
  • Android 中有没有办法获取 SD 卡大小?

    欢迎大家 我已经在 Stackoverflow 和 google 上尝试过与此相关的每个问题 但没有一个有效 我已经尝试过类似下一个链接的操作 但它返回的内容与内部存储相同 如何获取外部存储 SD 卡的大小 带安装的 SD 卡 https
  • 我的 Android 设备需要安装哪个驱动程序才能运行我的应用程序?

    我购买了 intex mobile 来在真实设备中测试我的 Android 应用程序 然而 该设备不存在于 OEM USB 驱动程序列表中 android 提供的设备列表中 我检查了 intex 官方网站 但不确定到底需要安装哪个驱动程序
  • 需要在 Android 中伪造正在扫描的 NFC 标签

    好的 我有一个应用程序 此应用程序仅在扫描 NFC 标签 任何标签 时才会完成任务 唯一的问题是 我没有任何 nfc 标签 无论如何 我正试图消除对卡的需要 所以我需要的是一种 伪造 使其看起来 就像已扫描 nfc 标签的方法 我可以编写应
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • Android BLE 扫描在后台几分钟后停止

    当我为公司开发新冠肺炎接触者追踪应用程序时 我在后台遇到了 Android 扫描停止问题 这是我尝试过的 添加前台服务 禁用手机中所有与电池相关的优化选项 启用后台运行的应用程序 测试设备 搭载 Android 10 的 Galaxy S2
  • 如何更改对话框片段内的片段

    我想做一个空的DialogFragment with a LinearLayout然后更改里面的片段LinearLayout 例如 第一个片段是 3 个按钮 facebook google 电子邮件登录 的登录 当有人按下电子邮件时 第 2
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • 如何在android中画一条曲线?

    我是 Android 新手 正在开发一个关于绘制线条的示例项目 我想画一条连接两点的曲线或高架线 x1 y1 and x2 y2 我试过canvas drawArc 方法 但是RectF内的值drawArc方法只是圆的 x y 中心点 它在
  • 如何在Android网格视图中设置单元格大小?

    我正在尝试为应用程序制作一个带有大图标的网格视图 但我找不到任何有关修改 Android 上网格布局上的单元格大小的教程 有人可以给我一个例子或相关链接吗 Thanks 就像另一个一样适配器视图 http developer android
  • 使用后退按钮启动 Activity

    我正在 Android 中开发一个应用程序 我正在寻找解决方案 有一个活动 例如 A1 通过单击按钮 用户可以转到另一个活动 例如 A2 现在 一旦用户完成 A2 活动 他就会单击后退按钮 返回到上一个活动 A1 这是众所周知的事实 A1此
  • BitmapFactory.decodeResource() 忽略 jpg 图像的 inPreferredConfig 选项

    我尝试将jpeg资源图像加载到ARGB 8888格式的位图 BitmapFactory Options opts new BitmapFactory Options opts inPreferredConfig Bitmap Config
  • 如何通过 AppCompatActivity 使用 YouTube Android 播放器 API

    为了在我的应用程序中播放视频 我决定扩展 YouTube Android Player API 但问题是我的菜单消失了 因为我没有从 AppCompatActivity 扩展 问题是 如何使用 YouTube Android Player
  • 如何从灰度字节缓冲区图像创建位图?

    我正在尝试使用新的 Android 人脸检测移动视觉 API 来处理帧图像 所以我创建了自定义检测器来获取帧并尝试调用 getBitmap 方法 但它为空 所以我访问了帧的灰度数据 有没有办法从它或类似的图像持有者类创建位图 public
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐

  • Firebase Auth,在用户注册之前获取用户UID

    我正在为我们的应用程序开发邀请机制 新用户将被邀请提供他们的电子邮件地址或电话号码 我想保留一些有关受邀请但未注册的用户的记录 因此 我希望在他们注册之前就获得他们的 Firebase Auth 用户 UID 这可能吗 也许使用 Fireb
  • 如何使Python中的浮点值显示.00而不是.0?

    简单的问题 抱歉我无法弄清楚 我有一些数字是由 浮动 字符串 它们显示为 xxx 0 但如果确实是整数 我希望它们以 00 结尾 我该怎么做 Thanks EDIT Python 说 float 没有 cal format gt gt gt
  • windows下无法用emacs + sbcl启动slime

    我想配置我的 emacs 以使用 SLIME 和 SBCL emacs 文件如下所示 add to list load path D app slime setq inferior lisp program sbcl require sli
  • 选择器资源可以使用样式中定义的颜色吗?

    我试图在选择器的样式中使用定义的颜色 但它导致了 Resources NotFoundException 首先 我向 attr xml 添加了一个新属性
  • 如何在 Xcode 7.3.1 的属性检查器中设置自定义展开转场动画

    我正在尝试通过 Xcode 7 2 1 中的故事板设置自定义展开转场动画 如果我在文档大纲中选择展开转场 我会看到属性检查器中有一个可用的类选项来提供 UIStoryboardSegue 类 但是 当我在那里设置自定义 Segue 类并运行
  • Embeddable、Hibernate 中的多对一关系

    我有一个场景Embeddablehibernate 中的类使用Entity 根据我在SO和其他链接上找到的各种答案 我们可以写 ManyToOne OneToMany里面一个Embeddable class 但这样做让我HibernateM
  • 用 Python 重复读取 CSV?

    我正在尝试根据我已有的 csv 检查提取的数据的值 它只会循环遍历 CSV 的行一次 我只能检查 feed items 的一个值 我需要在某处重置某个值吗 有没有更好 更有效的方法来做到这一点 谢谢 orig csv reader open
  • 如何在 Visual Studio 代码中切换文本大小写

    如何在 Visual Studio Code 中切换突出显示文本的大小写 VS 通过 CTRL SHIFT U 和 CTRL U 允许这样做 是否有一个命令绑定可以设置来执行此操作 或者默认情况下是其他组合键 Echoing 只是另一个开发
  • 正则表达式匹配时间

    我希望我的用户能够输入时间表单 如果需要更多信息 用户用它来表示完成任务需要多少时间 如果填满 它将保存在数据库中 这是我所拥有的 0 1 0 9 2 0 4 0 5 0 9 0 5 0 9 它匹配空表单或 01 30 和 01 30 00
  • 如何使用PIL读取原始图像?

    我有一个原始图像 其中每个像素对应一个 16 位无符号整数 我正在尝试使用 PIL Image fromstring 函数进行读取 如以下代码所示 if name main if len sys argv 4 print Error mis
  • 我可以停止 CakePHP 获取查询的所有行吗?

    我正在使用 CakePHP 和 modelName gt find 调用选择相当多的行 可能是数百行 通常 在 PHP MySQL 中这当然不会成为问题 因为您在 while 循环中获取它们 但是 CakePHP 将所有行加载到一个数组中
  • 标准化设备坐标

    我正在编写一个处理 2D 图形形状的库 I m just wondering why should my coordinate system range from 1 1 for both the x and y axis instead
  • Angular 6:i18n:如何更新已翻译的现有 .xlf 文件?

    在 Angular 6 中 现在我想我理解了如何制作 i18n 文件并利用它们 例如https angular io guide i18n https angular io guide i18n 我想知道如何维护所述文件 如果我进入并更改
  • Docker - Spring Boot 应用程序 - 无法访问本地主机上的 MySql 服务器

    如何将在 Docker 中运行的 Spring Boot JAR 应用程序连接到我计算机上的 MySql 服务器 我尝试了不同的帖子 但这没有帮助 在我的 Spring Boot application properties 中 我有 sp
  • 如何在 R 中导入 matlab 表

    我有一个matlab mat文件与表数据类型我想将其导入 R 中 我为此使用 readMat R 正在将其作为列表读取 之后有没有办法将列表转换为 R 中的数据帧或表格格式 当我使用as dataframe我收到以下错误 Error in
  • 名称中带有点的 php 对象属性

    我有 mysql 表 其中包含 操作 日期 操作 名称 等列 将该表数据作为对象获取后 mysqli gt fetch object 我得到这个 行的 print r stdClass Object id gt 2 operation da
  • Composer - 添加 git 存储库而不使用composer.json

    我尝试从 github designmodo Flat UI 添加存储库 使用配置并收到错误No valid composer json was found in any branch or Your requirements could
  • Autodesk Forge BIM 360 API - 激活服务类型

    我们一直在使用 Forge API 在 BIM 360 中自动设置项目 但似乎无法找到自动激活服务 Field Glue 等 的方法 直觉上 我认为 service types 属性是执行此操作的方法 但服务没有激活 1 service t
  • 生产中未找到 symfony 2 路线

    我有这样的路线 login register 等 在开发环境中工作正常 起初 当我尝试通过 app php 而不是 app dev php 访问我的网站时 出现 404 错误 然后我跟着这个建议 https stackoverflow co
  • 可以将sharedPrefrence与Coroutine kotlin一起使用吗

    我已经注射了sharedPreference in ViewModel 我可以在嵌入 Coroutine 作用域时使用 Android 特定资源吗 当 ViewModel 失去作用域时 Coroutine 作用域会自动挂起 我的意思是 如果