RxJava与SQlite和ContentProvider操作
RxJava与SQlite和ContentProvider操作
我正在学习RxJava,并且为了帮助处理异步ContentResolver查询,我在编写一个名为SQLiteUtils
的辅助类。例如,这是queryInBackground
方法:\n
static publicObservable queryInBackground( final ContentResolver cr, final Uri uri, final String[] projection, final String selection, final String[] selectionArgs, final String sortOrder, final CursorHandler ch) { return Observable.create(new Observable.OnSubscribe () { @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()); }
\n其中CursorHandler
是一个接口:\n
/** * 实现此接口将Cursor转换为其他对象。 * * @param输入Cursor将转换为的目标类型。 */ public interface CursorHandler { T handle(Cursor cu) throws SQLException; }
\n我已经阅读了关于Schedulers的文档,但我不确定Schedulers.computation()
是否是正确的选择。\n如果我想为基本的HttpUrlConnection
操作实现类似的东西,我应该选择哪个Scheduler?我会选择Schedulers.io()
...但不确定。\n提前感谢。\n祝一切顺利,\nluca
RxJava with SQLite and ContentProvider operations的问题出现的原因是,当进行与文件系统、数据库或不同主机上的服务进行交互等非计算密集型任务时,使用Schedulers.io()调度器可以更好地管理线程池,以避免对CPU造成过大负载。
解决方法是使用Schedulers.io()调度器来处理这些非计算密集型任务。此调度器由一个无界线程池支持,适用于与文件系统、数据库或不同主机上的服务进行交互等任务。
另外,还可以考虑使用SQLBrite库来简化与SQLite数据库的交互。SQLBrite是一个由Square公司开发的库,可以提供响应式编程风格的SQLite操作,使得使用RxJava进行SQLite操作更加方便和高效。
总结起来,对于RxJava与SQLite和ContentProvider操作,使用Schedulers.io()调度器并结合SQLBrite库可以更好地处理非计算密集型任务,提高程序的性能和效率。