如何在rxjava中实现中断的线程?

时间:2018-07-21 11:27:08

标签: java android multithreading rx-java2

我有以下代码希望变为“响应式”:

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中断方案的任何想法?

非常感谢!

0 个答案:

没有答案