RXKotlin Break Inside doOnNext и вызов другой функции

Я использую 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() {
}

person Rashad.Z    schedule 13.11.2018    source источник
comment
Это зависит от того, что на самом деле выполняет другая функция. Не могли бы вы привести пример, что вы подразумеваете под этим. Также вы можете захотеть переместить observeOn вниз (или вообще не иметь его), потому что вы можете получить NetworkOnMainThreadException с этой настройкой.   -  person akarnokd    schedule 13.11.2018
comment
@akarnokd, пожалуйста, найдите мое отредактированное описание. я просто хочу разорвать цикл и запустить другую функцию. поэтому мой вопрос заключается в том, как разорвать петлю   -  person Rashad.Z    schedule 13.11.2018


Ответы (1)


Выделите часть, которую вы хотите разбить, из doOnNext use 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()
person akarnokd    schedule 13.11.2018