【问题标题】:Android LiveData Observer Not TriggeredAndroid LiveData 观察者未触发
【发布时间】:2020-07-31 03:54:53
【问题描述】:

我正在尝试在我的活动中添加一个观察者,但它似乎从未被触发。

我的应用程序上有一个按钮,当传感器测量数据时,连接到我的手机的传感器会开始测量数据,它会在我的XsDevice() 类中触发回调。

这是我的XsDevice() 类中的代码

private MutableLiveData<ArrayList<Float>> accelerationData = new MutableLiveData<>();
public LiveData<ArrayList<Float>> freeAccDataLiveData = accelerationData;


@Override
public void onXsensDotDataChanged(String s, XsensDotData xsensDotData) {
    ArrayList<Float> result = new ArrayList();

    for (Float freeAcc: xsensDotData.getFreeAcc()) {
        result.add(freeAcc);
    }
    accelerationData.postValue(result);
}

当回调函数被触发时,我使用postValue(result) 来更新accelerationData 变量,这就是我作为android 开发新手的地方。

我假设在我发布 freeAccDataLiveData 变量的值后会更新,这就是我所观察到的。

这是我活动中的观察者代码

private XsDevice xsDeviceClass = new XsDevice();

protected void onCreate(Bundle savedInstanceState) {
    ...
    xsDeviceClass.freeAccDataLiveData.observe(this, new Observer<ArrayList<Float>>() {
        @Override
        public void onChanged(ArrayList<Float> freeAccData) {
            for(int i = 0; i < freeAccData.size(); i++){
                Log.d("Free Acceleration Data", String.valueOf(freeAccData.get(i)));
            }
        }
    });

}

... 只是我未包含的标准 onCreate 代码的占位符。

我遇到的问题是 Log.d("Free Acceleration Data", String.valueOf(freeAccData.get(i))); 从未被记录,这一定意味着观察者没有工作。如果我将此日志直接添加到回调函数中,它可以正常工作,但我需要在我的 MainActivity 中获取数据

有没有我可能错过的简单内容?

【问题讨论】:

  • 您确定xsensDotData.getFreeAcc() 返回非空列表/数组吗?尝试在result.add(freeAcc);附近添加日志。
  • @JeneaVranceanu 我只是通过将完全相同的日志行添加到回调函数并用result 替换freeAccData 来仔细检查,并且正在显示日志
  • 我测试的代码与您发布的完全相同。如果调用 onXsensDotDataChanged 并设置非空列表,观察者将收到它而不做任何更改。请添加更多日志以确保。
  • 您的活动是否始终保持打开状态?也许它已经完成,当再次创建时,您希望看到一些结果。您确定这是发布更新的同一 XsDevice 实例吗?
  • @JeneaVranceanu @Brian 我刚刚意识到它是XsDevice 的不同实例,因为我在不同的活动中运行startMeasuring(),当我在相同的活动中运行startMeasuring() 时它可以工作。我如何从不同的活动中观察?对不起我的错误!

标签: android android-livedata


【解决方案1】:

livedata 的观察者只有在数据被 set 或 post 改变时才会被调用。因此,如果您没有初始化 XsDevice 类中的值,则在分配数据之前不会调用它。

如果要在 OnCreate 方法中默认获取回调,需要像这样设置AccelerationData的默认值。然后,你可以在注册观察者后立即获得回调。

class XsDevice {
    private MutableLiveData<ArrayList<Float>> accelerationData = new MutableLiveData<>();
    public LiveData<ArrayList<Float>> freeAccDataLiveData = accelerationData;

    public XsDevice() {
        accelerationData.postValue(new ArrayList<>());
    }
    ...
}

另外,请确保按预期调用 onXsensDotDataChanged 并且 freeAccData 不为空。否则即使调用也看不到日志。

【讨论】:

  • 您好,我将日志添加到 onXsensDotDataChanged 函数以仔细检查它是否被调用,我不确定为什么没有触发观察者
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 2018-10-18
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多