我对Rx调用的整体工作流程应该如下工作(无论当前的Rx代码如何):
Room
Dao
获取运动传感器读数列表(目的是将其上传到REST API)。我使用Single<List<Reading>>
进行此readings
列表为空,则执行jobFinished()
回调, 之后执行任何操作readings
不为空,则将网络呼叫链接到此Single
。网络呼叫返回Completable
Single
从不逻辑地抛出错误,因为它要么提取空的readings
列表jobFinished()
回拨reading
Dao
个
Single
成功,但Completable
错误,请更新Dao
我目前的代码如下:
Single.create<List<Reading>> {
readings = readingDao.getNextUploadBatch()
if (readings.isEmpty()) {
jobFinished(job, false)
return@create
}
it.onSuccess(readings)
}
.flatMapCompletable { api.uploadSensorReadings(it) }
.doOnTerminate {
jobFinished(job, !readingDao.isEmpty())
}
.subscribeOn(rxSchedulers.network)
.observeOn(rxSchedulers.database)
.subscribe(
{
readingDao.delete(*readings.toTypedArray())
},
{
markCurrentReadingsAsNotUploading()
}
)
上面代码的逻辑问题是(还没有在运行时测试它,但是编译它):
flatMapCompletable
列表为空,我想从readings
开始切断代码doOnTerminate
为空,我不希望readings
执行onComplete
非空,否则我不希望执行{}
subscribe
部分readings
块Completable
onError
也取得了成功{}
非空,否则我不希望subscribe
部分readings
阻止Completable
阻止public class LandVille {
private int[][] land;
private boolean hasHouse;
public static void main(String args[]) {
LandVille landVille = new LandVille(3, 4);
landVille.displayLand();
}
// Task A - constructor
LandVille(int numRows, int numColumns) {
land = new int[numRows][numColumns];
for (int i = 0; i < numRows; ++i) {
for (int j = 0; j < numColumns; ++j) {
land[i][j] = 0;
}
}
hasHouse = false;
}
// Task B
public void displayLand() {
for (int i = 0; i < land.length; ++i) {
for (int j = 0; j < land[i].length; ++j) {
System.out.print(land[i][j] + " ");
}
System.out.println();
}
}
// Task C
public void clearLand() {
for (int i = 0; i < land.length; ++i) {
for (int j = 0; j < land[i].length; ++j) {
land[i][j] = 0;
}
}
hasHouse = false;
}
}
失败我不确定如何将我的工作流程实现为高效且整洁的Rx调用链。我们非常欢迎任何建议!
答案 0 :(得分:3)
如果您想根据值执行不同的操作,请考虑// #end
:
flatMap