android - RXKotlin 在 doOnNext 内部中断并调用另一个函数

标签 android rx-java rx-kotlin

我刚开始使用 rx kotlin,还没有完全理解。我正在尝试遍历查询列表,并一个一个地执行它们。在这个列表中,我有一个特殊的字符串,一旦到达,我想打破循环并执行另一个功能

我怎样才能在下面的例子中做到这一点?

fun runQueries() {

     Observable.fromIterable(queriesTemp)

                    .subscribeOn(Schedulers.computation())
                    .doOnNext { query ->
                        if (query.contains("COMPLETION OF SDF QUERIES")) {
                            if (loginStatus == StaticVariables.FT_CASE_NEW_LOGIN) {
                                tasksQueriesTemp = arrayOfNulls(queries.size - queries.indexOf(query))
                                System.arraycopy(queries, queries.indexOf(query), tasksQueriesTemp, 0, tasksQueriesTemp!!.size)
                            }
                          // break the loop here 
                            runOtherQueries()
                             break
                        }
                        if (!TextUtils.isEmpty(query)) {
                            mDatabase.execSQL(query, false, "")
                        }
                        action(tasksQueriesTemp!!.indexOf(query))
                    }
                    .doOnComplete { executeOtherUpdates(tasksQueriesTemp) }
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe()
}

fun runOtherQueries() {
}

最佳答案

使用 takeWhiledoOnNext 中分解出你想要中断的部分:

val broken = AtomicBoolean();
Observable.fromIterable(queriesTemp)
    .subscribeOn(Schedulers.computation())
    .takeWhile { query ->
        if (query.contains("COMPLETION OF SDF QUERIES")) {
            if (loginStatus == StaticVariables.FT_CASE_NEW_LOGIN) {
                tasksQueriesTemp = arrayOfNulls(queries.size -
                    queries.indexOf(query))
                System.arraycopy(queries, queries.indexOf(query), 
                    tasksQueriesTemp, 0, tasksQueriesTemp!!.size)
            }
            // break the loop here 
            runOtherQueries()
            broken.set(true)
            return@takeWhile false  // whatever the Kotlin syntax is for local returns
        }
        return@takeWhile true
    }
    .doOnNext { query ->

        if (!TextUtils.isEmpty(query)) {
            mDatabase.execSQL(query, false, "")
        }
        action(tasksQueriesTemp!!.indexOf(query))
    }
    .doOnComplete { 
         // if you don't want to execute the other updates if the code
         // in takeWhile has "broken out of the loop"
         if (!broken.get())
             executeOtherUpdates(tasksQueriesTemp) 
    }
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe()

关于android - RXKotlin 在 doOnNext 内部中断并调用另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53281983/

相关文章:

android - 设计布局以支持多屏幕

android - 如何使用我的 android 应用程序在谷歌驱动器上上传文件

java - 使用多线程 RxJava 的响应式(Reactive)拉取

java - 使用 rx java 在非周期性间隔后发出事件

android - RXKotlin中的存储库模式连接结果

java - 如何在Java中根据公共(public)属性合并两个排序的对象列表

Android mediaplayer 有序播放歌曲

kotlin - defer() 和 defer{} 有什么区别

design-patterns - 使用 RX 通过中介在两个组件之间进行通信

android - RxJava/RxKotlin 提示访问 View