将广播接收器包装到 Flow(协程)中

2023-11-27

我有一个用于 wifi 扫描结果的广播接收器作为数据源,我想以协程方式制作它。我在这里找到了暂停功能的答案:https://stackoverflow.com/a/53520496/5938671

suspend fun getCurrentScanResult(): List<ScanResult> =
    suspendCancellableCoroutine { cont ->
        //define broadcast reciever
        val wifiScanReceiver = object : BroadcastReceiver() {
            override fun onReceive(c: Context, intent: Intent) {
                if (intent.action?.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) == true) {
                    context.unregisterReceiver(this)
                    cont.resume(wifiManager.scanResults)
                }
            }
        }
        //setup cancellation action on the continuation
        cont.invokeOnCancellation {
            context.unregisterReceiver(wifiScanReceiver)
        }
        //register broadcast reciever
        context.registerReceiver(wifiScanReceiver, IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION))
        //kick off scanning to eventually receive the broadcast
        wifiManager.startScan()
    }

这对于信号发射来说很好,但是如果我想在扫描过程中获得结果,那么我会崩溃,因为cont.resume()只能被调用一次。然后我决定尝试一下Flow。这是我的代码:

suspend fun getCurrentScanResult(): Flow<List<ScanResult>> =
    flow{
        val wifiScanReceiver = object : BroadcastReceiver() {
            override fun onReceive(c: Context, intent: Intent) {
                if (intent.action?.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) == true) {
                    //context.unregisterReceiver(this)
                    emit(wifiManager.scanResults)
                }
            }
        }
        //setup cancellation action on the continuation
        //register broadcast reciever
        context.registerReceiver(wifiScanReceiver, IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION))
        //kick off scanning to eventually receive the broadcast
        wifiManager.startScan()
    }

但现在 Android Studio 说Suspension functions can be called only within coroutine body为了功能emit(wifiManager.scanResults)这里有办法使用 Flow 吗?


请看一下回调流程这是专门为此用例设计的。像这样的事情就可以完成这项工作:

callbackFlow {
  val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent) {
      if (intent.action == WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) {
        sendBlocking(wifiManager.scanResults) // or non-blocking offer()
      }
    }
  } 
  context.registerReceiver(receiver, intentFilter)

  awaitClose {
      context.unregisterReceiver(receiver)
  }
}

您可能还想与例如共享此流程shareIn操作员以避免为每个流订阅者注册新的接收者。

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

将广播接收器包装到 Flow(协程)中 的相关文章

  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • 计数物体和更好的填充孔的方法

    我是 OpenCV 新手 正在尝试计算物体的数量在图像中 我在使用 MATLAB 图像处理工具箱之前已经完成了此操作 并在 OpenCV Android 中也采用了相同的方法 第一步是将图像转换为灰度 然后对其进行阈值计算 然后计算斑点的数
  • 当文本输入聚焦在 React Native for Android 的底部工作表上时,视图移出屏幕

    我正在使用图书馆 https github com osdnk react native reanimated bottom sheet https github com osdnk react native reanimated bott
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 尝试将相机切换回前面但出现异常

    尝试将相机切换回前面 但出现异常 找不到 问题请检查并帮助 error 01 27 11 49 00 376 E AndroidRuntime 30767 java lang RuntimeException Unable to start
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • 发布android后更改应用内购买项目的价格

    在 Google Play 上发布后 是否可以更改应用内购买商品的价格 我假设该应用程序也已发布 完整的在线文档位于http developer android com http developer android com也http sup
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • 如何默认在 ActionOpenDocument 意图中显示“内部存储”选项

    我需要用户选择一个自定义文件类型的文件 并将其从 Windows 文件资源管理器拖到 Android 设备上 但默认情况下内部存储选项不可用 当我使用以下命令启动意图时 var libraryIntent new Intent Intent
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 如何使用 npm 脚本重命名文件

    我在用复制文件作为一个 npmscirpt copyfiles u 2 src app conf dev json dist config 但最后我想把文件重命名 如何将输入文件重命名为类似的名称conf json 我检查了文档 没有发现可
  • 带定时器的 Windows 服务

    我在 c net 中创建了一个带有计时器的 Windows 服务 当我在 Visual Studio 中调试 构建项目时它工作正常 但安装后它不执行其操作 这背后的原因可能是什么 代码 public partial class Servic
  • 添加包含数字列的分箱值的列

    我有一个包含几列的数据框 其中一列是排名 是 1 到 20 之间的整数 我想创建另一列 其中包含 bin 值 如 1 4 5 10 11 15 16 20 最有效的方法是什么 我的数据框看起来像这样 csv 格式 rank name inf
  • 了解 WebElement.findElement() 和 XPATH

    我想使用WebElement findElement 使用 XPATH 定位父节点内节点的 API span class child class 我以为这会让我归还 div 那是在父级内部 然而 它返回了我在整个 DOM 树中找到的第一个
  • Flask 文件上传限制

    我有一个用于多个文件上传的文件上传处理程序 并设置了 MAX CONTENT SIZE 文档提到当总文件大小超过限制时 Flask 会抛出 413 异常 因此我还使用自定义 413 页面编写了 413 错误处理程序 但是 在测试文件上传时
  • Gettext 或数据库翻译

    哪个更好 gettext 基于自定义MySQL 缓存的功能 Gettext 是一种内置功能 因此我认为它已针对性能进行了调整 使用 poedit 是一种痛苦 而且不可能向任何客户展示 自定义功能允许简单的翻译界面 但可能对 php db 使
  • 在 ReactJS 中删除一个项目

    我是 React 新手 制作了一个允许保存搜索的应用程序 这将拉取 JSON 但当前正在从静态数组中拉取data 我无法从搜索列表中删除搜索 这是 jsbin http jsbin com nobiqi edit js 输出 这是我的删除按
  • 使用来自多个模块的 python 日志记录写入文件和 RotatingFileHandler

    我正在使用以下模块来记录模块中的事件 我这样称呼它 module 1 from tools debug logger import debug logger self logger debug logger start logger mod
  • 升级 numpy 失败并出现“权限被拒绝”错误

    我下载了一个预编译的numpy二进制来自http www lfd uci edu gohlke pythonlibs numpy并尝试升级我当前的numpy在 Windows 7 上安装 pip install upgrade numpy
  • 让 Android 应用程序带有后退按钮

    我希望我的 Android 应用程序的用户在某个活动按回时离开我的应用程序 这可以做到吗 一个好方法是等待第二次回来 private boolean doubleBackToExitPressedOnce false Override pu
  • 具有重复键的 data.table 上的滚动联接

    我试图理解rolling joins in data table 最后给出了重现这一点的数据 给定给定时间机场交易的数据表 gt dt t id airport thisTime 1 1 a 5 1 2 3 a 5 1 3 2 a 6 2
  • Makefile.am 创建空目录

    使用自动工具 我需要在键入 make install 时创建一个空目录树 例如 etc myprg foo 现在 我通过指定空目标来做到这一点 如下所示 myprgdir sysconfdir myprg myprgfoodir sysco
  • jQuery ContextMenu 事件在 IOS 8.2 中不起作用

    我在 html 示例中使用 contextMenu 事件 当我长按 DIV 时它将被触发 但现在它不起作用 最新的 IOS 8 2 版本中有什么问题吗 这是示例代码
  • java中如何将包含逗号的数字字符串解析为整数?

    我越来越NumberFormatException当我尝试解析 265 858 时Integer parseInt 有什么方法可以将其解析为整数吗 这个逗号是小数点分隔符还是这两个数字 在第一种情况下 您必须提供Locale to Numb
  • 如何设置ListView项目的突出显示颜色?

    我必须为 ListView 项目制作另一种突出显示颜色 我对项目使用自定义适配器 并且我有以下代码 Layout
  • LSD 能否从检测到的循环的下一次迭代中发出 uOP?

    我正在研究 Haswell 端口 0 上的分支单元的功能 从一个非常简单的循环开始 BITS 64 GLOBAL start SECTION text start mov ecx 10000000 loop dec ecx jz end 1
  • Visual Studio 2017 出现 CUDA 9 不受支持的错误

    我最近更新了 VS 2017 现在我什至无法构建默认的 CUDA 项目 带有向量加法的项目 我怀疑这是由于以下错误造成的 Severity Code Description Project File Line Suppression Sta
  • Matplotlib 中的 bin 大小(直方图)

    我正在使用 matplotlib 制作直方图 有没有办法手动设置垃圾箱的大小而不是垃圾箱的数量 实际上 这很简单 您可以提供带有垃圾箱边界的列表 而不是垃圾箱的数量 它们也可能分布不均 plt hist data bins 0 10 20
  • 没有 malloc 或 calloc 的 free() 函数

    快速提问 您可以使用 free 函数而无需事先调用 malloc 吗 ei void someFunc void char str 6 Hello some processing here free str 我没有遇到编译错误 但是这有效还
  • 将广播接收器包装到 Flow(协程)中

    我有一个用于 wifi 扫描结果的广播接收器作为数据源 我想以协程方式制作它 我在这里找到了暂停功能的答案 https stackoverflow com a 53520496 5938671 suspend fun getCurrentS