在我的应用程序中,我有一个函数,它每 2 秒调用一次蓝牙命令,通过 setInterval 函数询问设备的当前温度。
蓝牙响应由监控功能给出。我为此使用 react native-ble-plx 库。我对这个过程没有任何问题。
温度通过一个属性返回,该属性通过动作文件中的 redux 调度。但是当我将函数“调度”(通过 redux)到我的屏幕时,我有一个短暂的中断,这会导致延迟/生涩的行为。就我而言,我有一个滑动解锁按钮,在我的设备上调用调度时,触摸操作被中断,变得不直观和烦人。很难解释这个问题,但我的问题很简单,我如何设置 react-redux 不滞后,或者不中断 redux 调度上的当前用户交互?
我的应用程序基于此项目结构(用于带有 Ble 的 react-redux):https ://github.com/momolarson/BLEServiceDiscovery
环境:反应原生:0.63.3
反应原生 ble-plx:2.0.2
反应减少:7.2.1
这是我的应用程序的伪代码(代码更长,但我通过删除它们排除了所有其他代码):
HomeScreen.js
import stuff[...]
class HomeScreen extends Component {
componentDidMount() {
this.timer = setInterval(() => {
this.props.readTemp();
}, 2000);
}
render() {
const { value } = this.state
return (
<>
<ScrollView>
<Text>{this.props.temperatture}"></Text>
<Slide2Unlock/>
</ScrollView>
</>
);
}
}
function mapStateToProps(state) {
return {
temperature: state.temperature,
};
}
const mapDispatchToProps = dispatch => ({
readTemp: () => bluetooth.readTemp(),
})
export default connect(mapStateToProps, mapDispatchToProps())(HomeScreen);
redux 的动作文件:actionBt.js(我的文件是基于这个https://github.com/momolarson/BLEServiceDiscovery/blob/master/actions/index.js)
[...]
device.monitorCharacteristicForService(
characteristicData.serviceUUID,
characteristicData.uuid,
(error, characteristic) => {
if (characteristic != null && characteristic.value != null) {
dispatch(formatTemperature(characteristic.value));
}
},
);
感谢您的帮助
更新 1
我制作了我的应用程序的一个特定版本,没有蓝牙,只有解锁模块的幻灯片和一个带有 setInterval 的观察者,当状态被调度时,仍然有一个滞后的行为。我只用按钮完成了测试,当我点击然后通过调度显示值时,它仍然是同样的麻烦。
这是我的测试代码 index.js(redux 操作文件)
export const readTemp = () => {
return (dispatch, getState, DeviceManager) => {
const state = getState();
console.log("READ TEMP");
dispatch(temperatureSensor( Math.random(0,9) ))
}
}
function BLEservices(BLEServices) {
setInterval(() => {
BLEServices.readTemp();
}, 2500);
return (
<SafeAreaView style={styles.container}>
<Slider
childrenContainer={{ }}
onEndReached={() => {
console.log('REACHED')
}}
containerStyle={{
height:40,
margin: 8,
backgroundColor: "#EEEEEE",
overflow: 'hidden',
alignItems: 'center',
justifyContent: 'center',
width: '50%',
}}
sliderElement={
<Text style={{color:"#FFF"}}>TEST</Text>
}
>
<Text style={{color: "#D5BD9E"}}>unlock</Text>
</Slider>
<Text>Temperature: {BLEServices.temperatureSensor}</Text>
</SafeAreaView>
);
}
感谢您的建议和帮助
更新 2
找到解决方案,请参阅下面的答案。问题是调度中的 var 用户类型以及由于之前我在应用程序上进行的测试而不清理它们而产生的一些副作用。