带有SQlite和ContentProvider操作的RxJava

时间:2016-02-02 08:26:09

标签: android sqlite rx-java

我正在学习RxJava并且这样做我正在使用SQLite,编写一个帮助器类SQLiteUtils,以帮助更轻松地处理异步ContentResolver查询。 例如,这是queryInBackground方法:

static
public <T> Observable<T> queryInBackground(
        final ContentResolver cr,
        final Uri uri,
        final String[] projection,
        final String selection,
        final String[] selectionArgs,
        final String sortOrder,
        final CursorHandler<T> ch) {
    return  Observable.create(new Observable.OnSubscribe<T>() {
        @Override
        public void call(Subscriber<? super T> observer) {
            if (!observer.isUnsubscribed()) {
                Cursor cursor = null;
                try {
                    cursor = cr.query(uri, projection, selection, selectionArgs, sortOrder);
                    if (cursor != null && cursor.getCount() > 0) {
                        while (cursor.moveToNext()) {
                            observer.onNext(ch.handle(cursor));
                        }
                    }
                    observer.onCompleted();
                } catch (Exception err) {
                    observer.onError(err);

                } finally {
                    if (cursor != null) cursor.close();
                }
            }
        }
    }).subscribeOn(Schedulers.computation());
}

其中CursorHandler是一个接口:

/**
 * Implementations of this interface convert Cursor into other objects.
 *
 * @param <T> the target type the input Cursor will be converted to.
 */
public interface CursorHandler<T> {
    T handle(Cursor cu) throws SQLException;
}

我已阅读有关Schedulers的文档,但我不太确定Schedulers.computation()是否是正确的选择。

如果我想实现类似于基本HttpUrlConnection操作的东西,我应该选择哪个Scheduler? Schedulers.newThread()Schedulers.io(),我坚持使用Schedulers.io() ......但不确定。

提前致谢。

一切顺利, 卢卡

1 个答案:

答案 0 :(得分:3)

根据this answer,您应该使用Schedulers.io()。相关报价:

  

io()由无限制的线程池支持,就是这样   你将用于非计算密集型任务,就是那些东西   不会给CPU带来太多负担。所以yep与文件交互   系统,与不同主机上的数据库或服务的交互   很好的例子。