首页 > 解决方案 > Android观察数据未被调用

问题描述

嗨,我是 android 开发的新手,正在尝试了解架构,但过去 2 天一直在试图弄清楚LiveData

我正在使用允许我扫描一些传感器的 SDK,我在设备上显示传感器,然后切换开关以连接传感器。连接传感器后,我创建了一个按钮,该按钮运行一个调用startMeasuring()的函数,每次测量一些数据时都会触发回调,这就是我的斗争开始的地方。

在我的MainActivity我有以下代码,一旦我切换开关以连接到传感器,就会运行该代码。

public void onConnectedSensorClick(BluetoothDevice sensor, Integer position, Boolean checked) {
    XsensDotDevice xsDevice = new XsensDotDevice(this, sensor, new XsDevice(this));

    if (checked) {
        xsDevice.connect();
        mMainActivityViewModel.addConnectedSensor(xsDevice);
    }
}

需要 3 个参数:XsensDotDevice()上下文、扫描的传感器和回调类。

在我的回调类中,以下回调函数被覆盖

@Override
public void onXsensDotDataChanged(String s, XsensDotData xsensDotData) {
    
}

此功能是在我开始测量并且传感器向设备发送测量值时触发的功能。

我已经创建了一个ViewModelRepository我想用它来存储这些数据,这样我就可以在我的MainActivity使用中访问它Observer

我得到了ViewModelandRepository为我扫描的设备工作,但我不确定如何让它为测量数据工作,因为我无法访问ViewModel我的回调类XsDevice()中的 将数据传递给Repository

我想要做的是以某种方式将XsensDotData(测量数据)传递给SensorDataRepository然后Observer在我的MainActivity喜欢中创建一个。

mMainActivityViewModel.getSensorData().observe(this, new Observer<XsensDotData>() {
    @Override
    public void onChanged(XsensDotData xsensDotData) {
        for(int i = 0; i< xsensDotData.getFreeAcc().length; i++){
            Log.d("Sensor Data Acceleration " + i, String.valueOf(xsensDotData.getFreeAcc()[i]));
        }
    }
});

我已经创建了一个RepositoryViewModel我将在下面显示

存储库

public class SensorDataRepository {
    private static SensorDataRepository instance;
    private XsensDotData dataSet = new XsensDotData();

    public static SensorDataRepository getInstance() {
        if (instance == null) {
            instance = new SensorDataRepository();
        }
        return instance;
    }

    public MutableLiveData<XsensDotData> getSensorData() {
        MutableLiveData<XsensDotData> data = new MutableLiveData<>();
        data.setValue(dataSet);
        return data;
    }

    public void addSensorData(XsensDotData data) {
        dataSet = data;
    }
}

视图模型

public class MainActivityViewModel extends ViewModel {

    private MutableLiveData<ArrayList<BluetoothDevice>> mScannedSensors;
    private ScannedSensorRepository mScannedSensorRepo;

    private MutableLiveData<ArrayList<XsensDotDevice>> mConnectedSensors;
    private ConnectedSensorRepository mConnectedSensorRepo;

    private MutableLiveData<XsensDotData> mSensorData;
    private SensorDataRepository mSensorDataRepo;

    public void init() {
        if (mScannedSensors != null) {
            return;
        }
        mScannedSensorRepo = ScannedSensorRepository.getInstance();
        mScannedSensors = mScannedSensorRepo.getScannedSensors();

        if (mConnectedSensorRepo != null) {
            return;
        }
        mConnectedSensorRepo = ConnectedSensorRepository.getInstance();
        mConnectedSensors = mConnectedSensorRepo.getConnectedSensors();

        if (mSensorDataRepo != null) {
            return;
        }
        mSensorDataRepo = SensorDataRepository.getInstance();
        mSensorData = mSensorDataRepo.getSensorData();
    }

    public LiveData<ArrayList<BluetoothDevice>> getScannedSensors() {
        return mScannedSensors;
    }

    public void addScannedSensor(BluetoothDevice device) {
        mScannedSensorRepo.addScannedSensors(device);
    }

    public LiveData<ArrayList<XsensDotDevice>> getConnectedSensors() {
        return mConnectedSensors;
    }

    public void addConnectedSensor(XsensDotDevice device) {
        mConnectedSensorRepo.addConnectedSensors(device);
    }

    public LiveData<XsensDotData> getSensorData() {
        return mSensorData;
    }

    public void addSensorData(XsensDotData data) {
        mSensorDataRepo.addSensorData(data);
    }
}

我包含了扫描和连接设备的代码,ViewModel以防万一它派上用场并帮助解释发生了什么。

感谢您的任何帮助!

标签: android

解决方案


这是我如何使用 LiveData 的简单示例。在我的视图模型中,我将有一个值:

var isInternetAvailable = MutableLiveData<Boolean>().apply { value = true }

在我的活动中,我将获得代码:

viewmodel.isInternetAvailable.observe(this, Observer {
// execute your logic here
 var theValue = viewmodel.isInternetAvailable.value!!

}

然后在我的视图模型中,当互联网发生变化时,我将使用

viewmodel.isInternetAvailable.postValue(true)

因此,对于您的代码-据我所知,您正在观察该功能,但没有发布到它以触发您的观察者功能

您可以使用

 MutableLiveData<XsensDotData> data = new MutableLiveData<>();

接着

data.postValue(dataSet) 

这应该会触发你的观察者


推荐阅读