Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将rxjava2db查询到另一个主题_Android_Rx Java_Reactive Programming_Rx Java2 - Fatal编程技术网

Android 将rxjava2db查询到另一个主题

Android 将rxjava2db查询到另一个主题,android,rx-java,reactive-programming,rx-java2,Android,Rx Java,Reactive Programming,Rx Java2,在我的Android项目中,我非常依赖(使用RxJavaInterop)和 我有一个rx流,它应该无限期地运行(直到我的服务停止),在它上面我有一个函数的.flatMap 也就是说,这个flatMap包含一个Subject,将接收字符串actionId,对这些actionId进行一些(与问题无关)处理,并根据条件查询数据库中的Action对象,并将其发送给Subject 我的第一种方法是直接进行查询: Cursor c = db.query(...); if(c.moveFirst()) {

在我的Android项目中,我非常依赖(使用RxJavaInterop)和

我有一个rx流,它应该无限期地运行(直到我的服务停止),在它上面我有一个
函数的
.flatMap

也就是说,这个
flatMap
包含一个
Subject
,将接收
字符串actionId
,对这些actionId进行一些(与问题无关)处理,并根据条件查询数据库中的
Action
对象,并将其发送给
Subject

我的第一种方法是直接进行查询:

Cursor c = db.query(...);
if(c.moveFirst()) {
    Action a = Action.SELECT_ALL_MAPPER.map(c);
    subject.onNext(selectAll);
}
但这会阻止正在运行的线程,我宁愿在它自己的流上触发它,该流应该执行以下操作:

  • 查询(应返回0或1项)
  • 如果有值:映射到
    操作
    对象并将值推送到
    主题
  • 如果没有值:终止/处置
  • 主题
    无法接收终止或错误。它必须在未来的事件中保持活力
我目前的做法是以下代码:

RxJavaInterop.toV2Observable(db.createQuery(
    Action.TABLE_NAME,
    Action.FACTORY.Select_by_id(actionId).statement)
    .mapToOne(new Func1<Cursor, Action>() {
        @Override public Action call(Cursor cursor) {
            return Action.SELECT_ALL_MAPPER.map(cursor);
        }
    }))
    .take(1)
    .subscribe(new Consumer<Action>() {
        @Override public void accept(Action action) throws Exception {
            subject.onNext(action);
        }
    });
RxJavaInterop.toV2Observable(db.createQuery(
Action.TABLE_名称,
Action.FACTORY.Select_by_id(actionId).statement)
.mapToOne(新函数1(){
@重写公共操作调用(游标){
返回操作。选择所有映射器映射(光标);
}
}))
.采取(1)
.订阅(新消费者){
@重写公共void接受(操作)引发异常{
subject.onNext(行动);
}
});
虽然这似乎对第一印象起了作用,但我看到了一些错误:

  • 我不能处理它。即使我得到了对一次性物品的引用,我也不能从内部调用它
    消费者
    ,因为它“可能还没有初始化”(我理解原因,没关系)
  • 如果没有使用给定ID的操作,可观察对象将永远挂在那里,直到VM被杀死
那么问题是:

我该怎么做

我宁愿在它自己的流中触发它

看一看。这可能看起来像:

yourRxStream
    .flatMap(*db request here*)
    .subscribeOn(Schedulers.io())
    .subcribe(subject);

主题
无法接收终止或错误。它必须活一段时间 未来事件

使用以下命令切换主题:

主题有助于弥合非Rx API之间的差距。然而 当他们收到一个
onComplete
onError
它们不再可用于移动数据。这是 可观察的契约,有时是期望的行为。最 但事实并非如此

继电器只是没有上述属性的主体。他们 允许您轻松地将非Rx API连接到Rx,而无需担心 意外触发一个终端状态



最后,对于无法输出0或1项的请求,使用。

中继是一个好主意,我会检查它。但是0或1很遗憾,它不能解决您的建议。RxJava2不接受
null
,它直接抛出NPE。此外,可观察的DB请求由sqlbrite库创建,它保持打开/更新状态,直到被释放。因此,我需要处理或超时以关闭它,因为我只需要1-off事件,然后等待下一个
actionId
,这将是一个新的查询。谢谢你的努力。既然你不能发送null,我在考虑写一个基本的monad来把这个项目或者没有项目包装成一个类,这个类可以叫做Maybe。然后我想起可能已经存在作为一个可观察的替代品。因为它非常合适,我更新了我的答案。