الروبوت آر إكس المراقب إلى قاعدة بيانات سكليتي لا يعمل
-
26-12-2019 - |
سؤال
أحاول إضافة مراقب ر إلى قاعدة بيانات سكليتي وأنا بالتأكيد في عداد المفقودين شيء من تنفيذ بلدي كما لا 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();
}
}
ضع في اعتبارك أنه منظم مثل هذا ، في حالة عدم وجود بيانات ، فإنه سيغلق الاشتراك (أونيرور يفعل ذلك) حتى لا تتمكن من تلقي أي بيانات أخرى من المحمل.إذا كنت لا تريد ذلك ، ثم في حالة أونيرور أعلاه ، كنت في الواقع استدعاء أوننكست مع نول أو أريليست جديدة ومن ثم الاعتناء بها في المراقب الخاص بك.