java - 在不冻结应用程序的情况下更新 TextView
问题描述
我正在从设备传感器(多个传感器)读取传感器数据并调用一个方法来显示我从传感器接收到的数据到设计的 TextView。
我调用更新 TextView 的方法:
private void UpdateDataStream(String _Entry,Boolean isAppend)
{
if(isAppend)
ViewHolder.append("\n("+sensorName+")"+_Entry);
else
ViewHolder.setText("("+sensorName+")"+_Entry);
}
从SensorEventListener 的onSensorChanged事件调用的方法。
我想不通的是如何在更新 TextView 时防止冻结;由于传感器数据更新是密集的(考虑到它同时来自多个传感器)更新 TextView 导致应用程序冻结或崩溃。我不需要“打印”我收到的每一个数据,就像我每 1-2 秒打印一次就足够了,丢失的数据可以忽略不计。
是否有任何方法/模式或内置结构来实现这一目标?(我是 Java 和 Android 编程的新手,但我熟悉多道程序、并行编程概念,但我不知道如何在这种环境中应用它们)
解决方案
这是最快的解决方案: https ://github.com/ReactiveX/RxJava http://reactivex.io/documentation/operators/debounce.html
或者您可以:
- 创建堆栈(例如)
- 将传感器数据流写入堆栈
thread#1
- 在另一个无限循环中,每N
thread#2
次从堆栈中读取最后一个数据(不要忘记同步它们) - 清理堆栈
- 将最后一个数据写入 TextView(不要忘记在 ui 线程中设置文本:
textView.post( () -> textView.setText("safe call") );
推荐阅读
- java - 在eclipse中执行AWS命令
- javascript - 如何以百分比接收图像的值
- r - 调度一个 R 脚本,在 Windows 上出现错误时显示一个弹出/消息框
- javascript - 使用 javascript 将 html 数据插入 SharePoint 列表
- java - 在 Spring 中使用 @RequestPart 时 @Valid 不起作用
- python - PySpark - 如何转置数据框
- amazon-web-services - API 网关映射模板可选字段
- javascript - 在控制台中获取源映射错误警告
- c# - 如何反序列化 JSON 对象并在 C# 中获取值?
- configuration - 负载均衡器没有可供客户端使用的服务器。怎么解决?