An RX replacement for android.content.CursorLoader
Min API level 9
For RxJava 2
compile 'com.github.doctoror.rxcursorloader:library:[version]'
If you need RxJava 1, you can use the old version
compile 'com.github.doctoror.rxcursorloader:library:1.1.5'
Create a Query using Query.Builder. The required parameter is only a content URI.
final RxCursorLoader.Query query = new RxCursorLoader.Query.Builder()
.setContentUri(MediaStore.Audio.Media.INTERNAL_CONTENT_URI)
.setProjection(new String[]{MediaStore.Audio.Media._ID})
.setSortOrder(MediaStore.Audio.Artists.ARTIST)
.setSelection(MediaStore.Audio.Artists.ARTIST + "=?")
.setSelectionArgs(new String[] {"Oh Long Johnson"})
.create();
Thare are two cases covered by this library.
- You want to load the Cursor once
RxCursorLoader.single(getContentResolver(), query)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handleAndCloseCursor);
- You want to reload a Cursor every time the content under URI changes, just like CursorLoader does. Note that unlike CursorLoader, this does not close the Cursor for you, so make sure to close old cursor once onNext() is called.
mCursorDisposable = RxCursorLoader
.flowable(getContentResolver(), params, Schedulers.io(), BackpressureStrategy.LATEST)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(c -> mCursorAdapter.changeCursor(c));
You must call Disposable.dispose() when finished so that the library unregisters the ContentObserver
@Override
protected void onStop() {
super.onStop();
// stop using Cursor
mAdapter.changeCursor(null);
// Unsubscribe to close the Cursor and stop monitoring for ContentObserver changes
mCursorDisposable.dispose();
}
If ContentResolver query returns null, onError()
will be called with QueryReturnedNullException
Copyright 2016 Yaroslav Mytkalyk
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.