Android RX 옵저버로 SQLite 데이터베이스로 작동하지 않습니다
-
26-12-2019 - |
문제
SQLite 데이터베이스에 RX 옵저버를 추가하려고하고 있으며 내 구현에서 뭔가를 누락 한 것입니다. 내 구현에서 내 관찰자의 onNext()
메소드가 호출되지 않습니다.
여기 내 관찰자가 있습니다 :
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();
}
};
.
이들은 내 onCompleted()
메소드입니다.
@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);
}
.
나는이 코드의 모든 곳에서 로그를 두고이 LoaderCallback
및 onNext
메소드를 제외하고는 인쇄 될 때 인쇄됩니다.내 구현에서 누락 될 수있는 아이디어는 무엇입니까?
해결책
위의 코드에 몇 가지 문제가 발생합니다.
1st : onnext / onCompleted Anywhere를 실제로 호출하지 않습니다. 두 개의 패러다임 (Loader & RX)을 연결하려고하면 onloadFinished (데이터가 없을 때 호출 할 경우 onError와 함께 OnError와 함께 OnError와 함께 oneRnext를 넣어야합니다. OnLoadErreSet
2nd : 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의 경우는 실제로 onnext를 null 또는 새 ArrayList로 호출 한 다음 옵저버에서 처리하십시오.