我有以下代码希望变为“响应式”:
class ReadThread extends Thread {
@Override
public void run() {
super.run();
while(!isInterrupted()) {
try {
String result = doBlockingIO();
listener.onReceivedData(result);
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}
如果我想停止I / O操作,我会打电话给
readThread.interrupt();
我最初的rxjava2实现如下:
mCompositeDisposable.add(Maybe.fromCallable(() -> {doBlockingIO();}))
.repeat()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new ResourceSubscriber<String>() {
@Override
public void onNext(String data) {
onReceivedData(data);
}
@Override
public void onError(Throwable e) {
onErrorOccurred(e);
}
@Override
public void onComplete() {
// do nothing
}
}));
因为这是一个Android应用程序,所以在我的onStop()
活动回调中,我在上面的一次性复合材料上叫dispose()
。
在某些设备上运行上面的rxjava2代码会有一些怪异的副作用,例如当我停止IO Activity并转到另一个也使用类似的可组合一次性操作和IO操作的Activity时,某些操作似乎冻结了。同样通过查看一些日志,我可以告诉我运行doBlockingIO
的rxjava2线程在我离开并返回IO活动之后完成了:
07-21 19:18:17.420 5774-434/com.mobile.installation E/IOActivity: doBlockingIO() -> PRE RxCachedThreadScheduler-5 --->> LEFT ACTIVITY
07-21 19:18:30.134 5774-565/com.mobile.installation E/IOActivity: doBlockingIO() -> PRE RxCachedThreadScheduler-6 --->> RE-ENTERED ACTIVITY
07-21 19:18:30.847 5774-434/com.mobile.installation E/IOActivity: doBlockingIO() -> POST RxCachedThreadScheduler-5
关于如何使用rxjava2正确实现典型的Java IO中断方案的任何想法?
非常感谢!