【问题标题】:Update TextView without Freezing Application在不冻结应用程序的情况下更新 TextView
【发布时间】:2020-08-11 17:06:40
【问题描述】:

我正在从设备传感器(多个传感器)读取传感器数据,并调用一个方法将我从传感器接收到的数据显示到设计的 TextView。

我调用的更新 TextView 的方法:

private void UpdateDataStream(String _Entry,Boolean isAppend)
{
    if(isAppend)
        ViewHolder.append("\n("+sensorName+")"+_Entry);
    else
        ViewHolder.setText("("+sensorName+")"+_Entry);
}

SensorEventListener'sonSensorChanged 事件调用的方法。

我想不通的是如何在更新 TextView 时防止冻结;由于传感器数据更新是密集的(考虑到它同时来自多个传感器)更新 TextView 导致应用程序冻结或崩溃。 我不需要“打印”收到的每一个数据,比如我每 1-2 秒打印一次就足够了,丢失的数据可以忽略。

是否有任何方法/模式或内置结构来实现这一点? (我是 Java 和 Android 编程的新手,但我熟悉多道程序、并行编程概念,但我不知道如何在这种环境中应用它们)

【问题讨论】:

    标签: java android multithreading user-interface android-asynctask


    【解决方案1】:

    这是最快的解决方案: https://github.com/ReactiveX/RxJava http://reactivex.io/documentation/operators/debounce.html

    或者你可以:

    • 创建堆栈(例如)
    • 将传感器数据流从thread#1 写入堆栈
    • 在另一个无限循环中thread#2N 次从堆栈中读取最后一个数据(不要忘记同步它们)
    • 清理堆栈
    • 将最后一个数据写入TextView(不要忘记在ui线程中设置文本:textView.post( () -> textView.setText("safe call") );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 2017-12-12
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多