android - 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) {
}
此功能是在我开始测量并且传感器向设备发送测量值时触发的功能。
我已经创建了一个ViewModel
,Repository
我想用它来存储这些数据,这样我就可以在我的MainActivity
使用中访问它Observer
我得到了ViewModel
andRepository
为我扫描的设备工作,但我不确定如何让它为测量数据工作,因为我无法访问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]));
}
}
});
我已经创建了一个Repository
,ViewModel
我将在下面显示
存储库
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
以防万一它派上用场并帮助解释发生了什么。
感谢您的任何帮助!
解决方案
这是我如何使用 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)
这应该会触发你的观察者
推荐阅读
- python - Pythonian 结束 while 循环的方式
- visual-studio-code - 仅 Travis CI 上的错误 extensionTestsPath
- php - 虚拟 pos 表单发布后 Opencart 会话删除
- javascript - 使用 onchange 函数从选择中获取先前的值
- java - 带有 JDK 11 的 TOMCAT 7.0.92:- 错误 localhost-startStop-1 org.apache.catalina.startup.ContextConfig - 无法处理 Jar tools.jar 的注释
- python - Python 告诉我 66 <= 17
- angular - Typescript -> 知道给定的接口是否在类型别名中
- javascript - Bootstrap Datepicker 仅年份不绑定
- git - 如何将未提交的更改放在 SourceTree 的新分支上?
- c++ - 如何在 C++ 中使用另一个类的值?