在不冻结应用程序的情况下更新TextView

时间:2020-04-28 00:42:48

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

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

我正在调用的更新TextView的方法:

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

SensorEventListener's onSensorChanged 事件调用的方法。

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

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

1 个答案:

答案 0 :(得分:1)

这是最快的解决方案: 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") );