在不冻结应用程序的情况下更新 TextView
Update TextView without Freezing Application
我正在从设备传感器(多个传感器)读取传感器数据,并调用一个方法来显示我从传感器接收到的数据到设计的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 会导致应用程序冻结或崩溃。 我不需要"print"我收到的每条数据,比如我每1-2秒打印一次就足够了,丢失的数据可以忽略。
是否有任何 approach/patern 或内置结构来实现此目的?
(我是 Java&Android 中的编程新手,但我熟悉多道程序设计、并行编程概念,但我不知道如何在这种环境中应用它们)
这是最快的解决方案:
https://github.com/ReactiveX/RxJava
http://reactivex.io/documentation/operators/debounce.html
或者您可以:
- 创建堆栈(例如)
- 将传感器数据流写入来自
thread#1
的堆栈
- 在另一个无限循环中
thread#2
每 N 次从堆栈中读取最后一个数据(不要忘记同步它们)
- 清理堆栈
- 将最后的数据写入 TextView(不要忘记在 ui 线程中设置文本:
textView.post( () -> textView.setText("safe call") );
我正在从设备传感器(多个传感器)读取传感器数据,并调用一个方法来显示我从传感器接收到的数据到设计的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 会导致应用程序冻结或崩溃。 我不需要"print"我收到的每条数据,比如我每1-2秒打印一次就足够了,丢失的数据可以忽略。
是否有任何 approach/patern 或内置结构来实现此目的? (我是 Java&Android 中的编程新手,但我熟悉多道程序设计、并行编程概念,但我不知道如何在这种环境中应用它们)
这是最快的解决方案: https://github.com/ReactiveX/RxJava http://reactivex.io/documentation/operators/debounce.html
或者您可以:
- 创建堆栈(例如)
- 将传感器数据流写入来自
thread#1
的堆栈
- 在另一个无限循环中
thread#2
每 N 次从堆栈中读取最后一个数据(不要忘记同步它们) - 清理堆栈
- 将最后的数据写入 TextView(不要忘记在 ui 线程中设置文本:
textView.post( () -> textView.setText("safe call") );