【问题标题】:How to iterate over a list, and when finish launch a method with RXJava如何迭代列表,以及何时使用 RXJava 启动方法
【发布时间】:2019-08-23 09:36:23
【问题描述】:

我有一个数据模型列表,所以我必须应用一个返回视图的方法。

当一切都计算完毕后,我必须启动一个方法,它会进行另一种类型的计算。

问题是,正如我所拥有的那样,在第二种方法的每次迭代中都会启动。(肯定我错过了什么或做错了,但我对 RX 的了解非常低)

是否可以为每个方法进行所有计算,完成后,只启动该方法一次?

val markersViewList = hashMapOf<String, View>()
val subscription = Observable.fromIterable(retrivedUserInfoList)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
    .map { userInfo ->
        val markerLayout = setupUpForMarkerLayout(userInfo)
        if (markerLayout != null) {
            if (userInfo.userId == owner.uid) { //is owner
                markerViewList[OWNER] = markerLayout
            } else {
                if (!markerViewList.containsKey(userInfo.data1)) {
                    markerViewList[userInfo.data1] = markerLayout
                }
            }
        }
    }
    .subscribe {
        //THIS IS THE METHOD THAT ONLY HAS TO BE CALCULATED ONCE
        createImages(retrivedUserInfoList,markerViewList)
    }

addSubscription(subscription)

【问题讨论】:

    标签: android kotlin iteration rx-java


    【解决方案1】:

    您可以使用ignoreElements() 运算符:

    val markersViewList = hashMapOf<String, View>()
    val subscription = Observable.fromIterable(retrivedUserInfoList)
        .subscribeOn(Schedulers.computation())
        .observeOn(AndroidSchedulers.mainThread())
        .map { userInfo ->
            val markerLayout = setupUpForMarkerLayout(userInfo)
            if (markerLayout != null) {
                if (userInfo.userId == owner.uid) { //is owner
                    markerViewList[OWNER] = markerLayout
                } else {
                    if (!markerViewList.containsKey(userInfo.data1)) {
                        markerViewList[userInfo.data1] = markerLayout
                    }
                }
            }
        }
        .ignoreElements()
        .subscribe {
            //THIS IS THE METHOD THAT ONLY HAS TO BE CALCULATED ONCE
            createImages(retrivedUserInfoList, markerViewList)
        }
    
    addSubscription(subscription)
    

    它会将您的Observable 转换为Completable,因此您的subscribe 块只会在完成时被调用一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多