【问题标题】:RXKotlin Break Inside doOnNext and Call Another FunctionRXKotlin 中断 doOnNext 并调用另一个函数
【发布时间】:2019-04-16 08:15:21
【问题描述】:

我正在使用 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() {
}

【问题讨论】:

  • 这取决于“执行另一个功能”实际上是什么。您能否发布一个示例,您的意思是什么。此外,您可能希望将observeOn 移动到底部(或根本没有),因为您可能会通过此设置获得NetworkOnMainThreadException
  • @akarnokd 请找到我编辑的描述。我只是想打破循环并运行不同的功能。所以我的问题只是如何打破循环

标签: android rx-java rx-kotlin


【解决方案1】:

doOnNext 使用takeWhile 中分解出您想要突破的部分:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-02
    • 2015-03-02
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多