有条件的单链和可完成

时间:2018-03-17 04:11:55

标签: android multithreading parallel-processing kotlin rx-java

我对Rx调用的整体工作流程应该如下工作(无论当前的Rx代码如何):

  • Room Dao获取运动传感器读数列表(目的是将其上传到REST API)。我使用Single<List<Reading>>进行此
  • 如果readings列表为空,则执行jobFinished()回调, 之后执行任何操作
  • 如果readings不为空,则将网络呼叫链接到此Single。网络呼叫返回Completable
  • Single从不逻辑地抛出错误,因为它要么提取空的readings列表
  • 当整个Rx呼叫链终止时,执行jobFinished()回拨
  • 关于整个Rx调用链的成功,请从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部分readingsCompletable 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调用链。我们非常欢迎任何建议!

1 个答案:

答案 0 :(得分:3)

如果您想根据值执行不同的操作,请考虑// #end

flatMap