为什么我的订阅永远不会完成?

时间:2015-06-29 11:59:43

标签: android rx-java netflix

我正在尝试在android的上下文中学习rxJava和反应式编程,我觉得我几乎就在那里,我只是无法完全理解我完全理解我在做什么。

我有以下代码,它从数据库中获取一个名为iApps的类的实例列表

 myHelper m = new myHelper(getApplication());
        m.getApps()
                .observeOn(Schedulers.newThread())
                .subscribe(currentApps::addAll,
                        throwable -> Log.e("Error Observable", throwable.toString() + " " + Arrays.toString(throwable.getStackTrace())),
                        () -> compareLists(availableApps, currentApps));
}

使用以下方法: //来自我的数据库调用函数

public  Callable<ArrayList<iApp>> getApps()
    {
        return this::getCurrentInfo;
    }

自定义助手功能

public class myHelper {

    Context ctx;
    tQuery t;
    public myHelper(Context _ctx)
    {
        this.ctx = _ctx;
        t = new tQuery(_ctx);
    }

    Observable<ArrayList<iApp>> getApps()
    {
        return makeObservable(t.getApps())
                .subscribeOn(Schedulers.computation());
    }

    private static <T> Observable<T> makeObservable(final Callable<T> func) {
        return Observable.create(
                new Observable.OnSubscribe<T>() {
                    @Override
                    public void call(Subscriber<? super T> subscriber) {
                        try {
                            subscriber.onNext(func.call());

                        } catch (Exception ex) {
                            subscriber.onError(ex);
                        }
                    }
                });
    }

}

然而,我的完成永远不会运行。我通过循环遍历iApp的结果并输出其中一个字段来检查onNext,这样我就可以看到正在收集数据,但是我的compareLists函数永远不会运行。

有人可以解释我的疏忽吗?

1 个答案:

答案 0 :(得分:1)

那很令人尴尬!

private static <T> Observable<T> makeObservable(final Callable<T> func) {
        return Observable.create(
                new Observable.OnSubscribe<T>() {
                    @Override
                    public void call(Subscriber<? super T> subscriber) {
                        try {
                            subscriber.onNext(func.call());
                            subscriber.onCompleted();

                        } catch (Exception ex) {
                            subscriber.onError(ex);
                        }
                    }
                });
    }