小编jim*_*jim的帖子

在 ViewModel 中收集流。是否需要repeatOnLifeCycle?

到目前为止,我曾经在活动/片段或 ViewModel 中收集我的流,如下所示

活动/片段

lifecycleScope.launch {
    myViewModel.readTokenCredentials().collect { data -> /* do something */ }
}
Run Code Online (Sandbox Code Playgroud)

视图模型

viewModelScope.launch {
    prefsRepo.readTokenCredentials().collect { data -> /* do something */ }
}
Run Code Online (Sandbox Code Playgroud)

现在,谷歌开发人员告诉我们,这不是一种收集流量的安全方法,因为它可能会导致内存泄漏。相反,他们建议将集合包装在lifecycle.repeatOnLifecycle“活动/片段”中以进行流集合。

lifecycleScope.launch {
    lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
        myViewModel.readTokenCredentials().collect { data -> /* do something */ }
    }   
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

为什么在视图模型内收集流时不能使用repeatOnLifecyclewith ?viewModelScope当然,我知道视图模型不具有生命周期意识,但viewModelScope在流收集期间可能不太可能引入内存泄漏?

android kotlin kotlin-coroutines

17
推荐指数
2
解决办法
2万
查看次数

Jetpack Compose 内部阴影

如何使用 Jetpack Compose 创建内部阴影?渐变应从外部黑色到内部透明。Modifier.shadow()仅适用于外部阴影。使用负高度不起作用。

android android-jetpack-compose

7
推荐指数
2
解决办法
2万
查看次数

iOS-如何在BLE外设上发现未发布的服务

我得到了这个不公布其服务的Nordic nRF52 BLE外围设备。我可以连接到它,但是无法在iOS上发现服务。由于我知道服务UUID,因此我尝试将它们传递给discoverServices函数。但这是行不通的。

大约30秒后,它终于断开连接。

在外围设备上,GAP广告标记设置为General Discoverable。使用LightBlue或之类的应用程序,nRF Connect我看到外围设备的名称和UUID,但没有任何服务。与LightBlue应用程序连接时,几秒钟后显示错误(Timeout interrogating the peripheral)。

在Android上,发现未发布的服务就可以了。

从《核心蓝牙编程指南》开始,它基本上应该可以工作:

建立与外围设备的连接后,您可以浏览其数据。探索外围设备必须提供的第一步是发现其可用的服务。由于外围设备可以发布的数据量受到大小限制,因此您可能会发现外围设备提供的服务多于其发布的(在其广告包中)所提供的服务。您可以通过调用外围设备的discoverServices:方法来发现外围设备提供的所有服务,如下所示:[peripheral discoverServices:nil];

有谁知道SDK的区别是什么,以及是否有可能像Android一样在iOS上发现未发布的服务?

我了解到,缓存外设时,iOS能够直接连接,跳过发现过程。但是将外围设备缓存后,需要配对一次。有没有办法手动设置缓存?

感谢任何帮助,谢谢!

ios bluetooth-lowenergy gatt

2
推荐指数
1
解决办法
1903
查看次数