最近刚开始接触RxAndroid,刚刚起步,一切还在学习中。关于RxAndroid的基础知识什么的,大家可以自行度娘,很多人写的都不错,我也就不再赘述了,这篇介绍RxAndroid的入门知识的还不错,大家可以看看。
这次就来讲讲使用RxAndroid遇到的第一关。。。
rx.exceptions.MissingBackpressureException
这个异常其实网上的解释已经很多了,而且都比我的解决方法好了很多,在此我只根据我的代码来解释这一问题。
首先我的代码:
private void readFileSubsection() {
mECGFileName = mFileCaseModel.getPath();
try {
mFIS_ReadFile = new FileInputStream(mECGFileName);
} catch (IOException e) {
e.printStackTrace();
finishLoad(false);
}
Observable.create(new Observable.OnSubscribe<short[]>() {
@Override
public void call(Subscriber<? super short[]> arg0) {
try {
readDatasSubsection(arg0);
} catch (IOException e) {
if (isLoading) {
arg0.onError(e);
}
}
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(mRXReadSectionSubscriber);
}
public void readDatasSubsection(Subscriber<? super short[]> subscriber) throws IOException {
List<Short> totalDatas = new ArrayList<Short>();
List<Short> tempDatasList = new ArrayList<Short>();
byte[] tempdatas = new byte[6];
int count = 0;
final Integer beatNum = new Integer(0);
final Integer ArrhymiaNum = new Integer(0);
final Integer STNum = new Integer(0);
while ((count = mFIS_ReadFile.read(tempdatas)) != -1 && isLoading) {
if (count < 6) {
// 不够6个字节的,计算字节数对应的数据点数
count = (int) (count / 1.5);
for (int i = 0; i < count; i++) {
totalDatas.add((short) 2048); // 最后几个点全部置为0
}
break;
}
tempDatasList = DataProgress.toECGWaveDatas(tempdatas);
for (int i = 0; i < 4; i++) {
totalDatas.add(tempDatasList.get(i));
}
if (totalDatas.size() > 60 * ConstValue.SAMPLE_RATE) {
short[] data = MathUtil.convList2Arr(totalDatas);
RTECG.filter(data, data.length);
subscriber.onNext(data);
totalDatas.clear();
}
tempDatasList.clear();
tempdatas = new byte[6];
}
if (totalDatas.size() > 0 && isLoading) { // 读取到的数据不够60s
short[] data = MathUtil.convList2Arr(totalDatas);
RTECG.filter(data, data.length);
subscriber.onNext(data);
totalDatas.clear();
subscriber.onCompleted();
}
mFIS_ReadFile.close();
}
.....
代码的运用场景是,读取一个很长时间的数据文件,然后绘制波形。所以开始使用RxAndroid异步处理的时候,设计每次读取60s的数据然后更新波形数据,然后。。然后就出现了这个异常。。
rx.exceptions.MissingBackpressureException
通过搜索该异常的解决方案,得知是因为生产者(读文件)发送的太快了,而消费者(更新波形数据)消费的太慢,导致该异常的出现。
得知了该异常出现的原因,那么就修改了。反正我是分段读取文件的,读取60s的数据太快了,那就把读取数据的时间增加就可以了,后来我就把读取数据的大小改为读取30min的数据再发送,这样就解决了该问题。
// 增加每次循环读取到的数据长度为30min
totalDatas.size() > 1800 * ConstValue.SAMPLE_RATE
后来看到有介绍RxAndroid各种操作符的,才知道起始可以用到其他的操作符来解决该问题,我大概看了下,发现那些操作符大都是通过增加缓存或者丢弃数据来实现的,感觉不太适合我(个人理解…),不过可能是运用场景的问题,那些操作符还是很有用的,有兴趣的可以看看,这个写的还不错。
http://blog.chengyunfeng.com/?p=981&utm_source=tuicool&utm_medium=referral