java - Android RX Observer 到 SQLite 数据库不工作

标签 java android sqlite contentobserver rx-java

我正在尝试向我的 SQLite 数据库中添加一个 RX 观察器,我肯定在我的实现中遗漏了一些东西,因为 onNext()onCompleted() 方法都没有我的观察员没有接到电话。

这是我的观察者:

private final Observer<List<Order>> mObjectiveObserver = new Observer<List<Order>>() {
        @Override
        public void onCompleted() {
            System.out.println("Load completed");
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(List<Order> objectives) {
            System.out.println("On Next: " + objectives.size() + " elements found!");
            orderAdapter.clear();
            if (objectives != null) {
                orderAdapter.addAll(objectives);
                mCirclePulseView.setVisibility(View.INVISIBLE);
            } else {
                mCirclePulseView.setVisibility(View.VISIBLE);
            }
            orderAdapter.notifyDataSetChanged();
        }
    };

这些是我的 LoaderCallback 方法:

@Override
    public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
        Loader<Cursor> loader = null;
        switch (loaderId) {
            case LOADER_ORDERS:
                System.out.println("Create loader called");
                loader = new CursorLoader(OrderManagerApplication.getAppContext(), OrderManagerContract.Order.CONTENT_URI,
                        QueryOrder.PROJECTION_SIMPLE, null, null, OrderManagerContract.Order.DATE_SORT);
                break;
        }
        return loader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        if (getActivity() == null) {
            return;
        }

        if (data != null && !data.isClosed()) {
            System.out.println("Finished loading orders, data not null");
            switch (loader.getId()) {
                case LOADER_ORDERS:

                    if (subscription != null && !subscription.isUnsubscribed()) {
                        subscription.unsubscribe();
                    }

                    subscription = AndroidObservable
                            .bindFragment(this, DatabaseHelper.mainOrdersObservable(data))
                            .subscribeOn(Schedulers.computation())
                            .unsubscribeOn(AndroidSchedulers.mainThread())
                            .subscribe(mObjectiveObserver);
                    System.out.println("I should be here, onLoadFinished");
                    break;
            }
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }

内容观察器代码如下:

class HomeOrdersContentObserver extends ContentObserver {
        private int mLoaderId = 0;

        public HomeOrdersContentObserver(Handler handler, int loaderId) {
            super(handler);
            mLoaderId = loaderId;
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            if (getActivity() == null) {
                return;
            }

            Bundle bundle = new Bundle();
            //bundle.putString(FILTER_TXT, lastFilterQ);
            restartLoader(mLoaderId, bundle);
        }
    }

    public void restartLoader(int loaderId, Bundle args) {
        getLoaderManager().restartLoader(loaderId, args, this);
    }

我在我的代码中到处都放置了日志,它们会按应有的方式打印出来,除了 onNextonCompleted 方法。有什么想法我可能会在我的实现中遗漏什么吗?

最佳答案

我发现上面的代码有一些问题。

第一:您实际上并没有在任何地方调用 onNext/onCompleted。由于您正在尝试连接两个范例(Loader 和 Rx),因此您需要将 onNext 放在 onLoadFinished 中(使用 onError 以防您希望在没有数据时调用它,但这将关闭订阅)和 onCompleted onLoaderReset

第二:您正在 onLoadFinished 中重做订阅,我认为您不会想要 - 为什么每次有新数据时都想重新订阅?您应该在创建加载器时执行它,并在销毁加载器(onLoaderReset)时取消订阅。

这是一种可能的实现方式:

@Override
    public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
        Loader<Cursor> loader = null;
        switch (loaderId) {
            case LOADER_ORDERS:
                System.out.println("Create loader called");
                loader = new CursorLoader(OrderManagerApplication.getAppContext(), OrderManagerContract.Order.CONTENT_URI,
                        QueryOrder.PROJECTION_SIMPLE, null, null, OrderManagerContract.Order.DATE_SORT);

                if (subscription != null && !subscription.isUnsubscribed()) {
                    subscription.unsubscribe();
                }

                subscription = AndroidObservable
                        .bindFragment(this, DatabaseHelper.mainOrdersObservable(data))
                        .subscribeOn(Schedulers.computation())
                        .unsubscribeOn(AndroidSchedulers.mainThread())
                        .subscribe(mObjectiveObserver);
                break;
        }
        return loader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        if (getActivity() == null) {
            return;
        }

        if (data != null && !data.isClosed()) {
            System.out.println("Finished loading orders, data not null");
            switch (loader.getId()) {
                case LOADER_ORDERS:
                    mObjectiveObserver.onNext(data);
                    System.out.println("I should be here, onLoadFinished");
                    break;
            }
        } else {
            mObjectiveObserver.onError("No data available");
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        if (subscription != null && !subscription.isUnsubscribed()) {
            subscription.unsubscribe();
        }
    }

请记住,结构是这样的,如果没有数据,它实际上会关闭订阅(onError 会这样做),因此您将无法从加载程序接收更多数据。如果您不希望这样,那么在上述 onError 的情况下,您实际上会使用 null 或 new ArrayList 调用 onNext,然后在您的观察者中处理它。

关于java - Android RX Observer 到 SQLite 数据库不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25073232/

相关文章:

java - 重用默认的 Android 图片库?

linux - 在 Linux 中,是否有将 CSV 文件转换为 SQLite 文件的命令?

android - Android:将多行插入sqlite数据库不起作用

Java 为什么字符串的长度是 36 的两倍,而它只包含 18 个字符?

java - 无法将音频文件编码为 Vorbis

java - 为什么我得到一个空位图?

android - 了解 Firebase 消息传递的客户端流程

java - 指定 Axis 1.4 的日志设置

android - 发布构建 apk 文件

angular - 在 Angular + Electron 应用程序中使用 sqlite3 : Critical dependency: the request of a dependency is an expression