الروبوت آر إكس المراقب إلى قاعدة بيانات سكليتي لا يعمل

StackOverflow https://stackoverflow.com//questions/25073232

سؤال

أحاول إضافة مراقب ر إلى قاعدة بيانات سكليتي وأنا بالتأكيد في عداد المفقودين شيء من تنفيذ بلدي كما لا 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);
    }

لقد وضعت سجلات في كل مكان في التعليمات البرمجية الخاصة بي ويتم طباعتها كما ينبغي ، باستثناء هذا onNext و onCompleted طرق.أي أفكار ما قد أكون في عداد المفقودين من تنفيذ بلدي?

هل كانت مفيدة؟

المحلول

أرى بعض المشاكل مع التعليمات البرمجية أعلاه.

1:أنت لا تتصل في الواقع أوننيكست / أونكومبليتد في أي مكان.منذ كنت تحاول ربط اثنين من النماذج (لودر و ر) ، ثم سوف تحتاج إلى وضع أوننكست في أونلودفينيد (مع أونيرور في حال كنت تريد استدعاؤها عندما لا توجد بيانات ، ولكن هذا سوف يغلق الاشتراك) و أونكومبليتد في أونلودريسيت

2:أنت تعيد الاشتراك في أونلوادفينيديد, التي لا أعتقد أنك تريد - لماذا تريد إعادة الاشتراك في كل مرة يكون لديك بيانات جديدة?يجب عليك القيام بذلك عند إنشاء محمل ، وإلغاء الاشتراك عند تدمير محمل (أونلوديريسيت).

هذا هو أحد التنفيذ المحتمل:

@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();
        }
    }

ضع في اعتبارك أنه منظم مثل هذا ، في حالة عدم وجود بيانات ، فإنه سيغلق الاشتراك (أونيرور يفعل ذلك) حتى لا تتمكن من تلقي أي بيانات أخرى من المحمل.إذا كنت لا تريد ذلك ، ثم في حالة أونيرور أعلاه ، كنت في الواقع استدعاء أوننكست مع نول أو أريليست جديدة ومن ثم الاعتناء بها في المراقب الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top