rxjava :: zip函数返回一个空结果

时间:2017-10-29 15:40:18

标签: java kotlin rx-java

我正在使用Rxjava与我的应用程序,所以我可以从两个不同的API服务器获取我的数据,使用“zip”函数组合结果,这是我的代码: 的Class1: -

var service = retrofit(1).create<cc>(cc::class.java)
var service1 = retrofit(0).create<cc>(cc::class.java)
var obs: io.reactivex.Observable<JSONResponse> = service.getsky()
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())

var result2: io.reactivex.Observable<List<get>> = service1.getTrends()
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
var x:ArrayList<arrayitem> = ArrayList()


fun ini_conection() :ArrayList<arrayitem>{
    Observable.zip(obs, result2, BiFunction { 
        t1: JSONResponse, 
        t2: List<get> -> Pair(t1, t2) }).subscribe({

           for (i in 0..5) {
                x.add(arrayitem(gson.toJson(it.second.get(i).type)))
                x.add(arrayitem(gson.toJson(it.first.android?.get(i)?.title)))

            }

            for (s in x) {
                println(s)
            }


        })

        return x
}

当我在ex:class 2中调用结果时,就像这样

    val h =Main_con()
            Log.e("hi i am work", h.ini_conection().toString())

我得到的结果是一个空数组列表

这里也是我的arrayitem类:

data class arrayitem(var title: String)

顺便在ini_conection()函数的这个循环中,它打印正常的结果存储在x arraylist中 这是循环: -

 for (s in x) {
     println(s)
 }

2 个答案:

答案 0 :(得分:0)

您无法立即从异步中获取结果。它必须等待,而且只能通过回调访问ussualy。

返回x时,返回初始化的数组:

var x:ArrayList<arrayitem> = ArrayList()

获取填充结果的x,您可以使用interface或lambda来获得结果。

以下是使用lambda的示例:

fun ini_conection(onResult: ArrayList<arrayitem> -> Unit) {
    Observable.zip(obs, result2, BiFunction { 
        t1: JSONResponse, 
        t2: List<get> -> Pair(t1, t2) 
    }).subscribe({
        for (i in 0..5) {
            x.add(arrayitem(gson.toJson(it.second.get(i).type)))
            x.add(arrayitem(gson.toJson(it.first.android?.get(i)?.title)))
        } 

        for (s in x) {
            println(s)
        }
        onResult(x)
    })

}

你可以这样使用它:

val h = Main_con()
h.ini_conection({res -> Log.e("Work", res.toString())})

答案 1 :(得分:0)

您需要重新考虑您的代码。正如@ egon12指出的那样,你将首先返回空x,然后可能在订阅块中对该数组进行一些操作。

有办法解决这个问题。

  1. 丑陋的,你可以使用Observable.toBlocking(),这将使你成为reactive code

  2. Observable<ArrayList<arrayitem>>返回ini_conection()并在其他地方订阅。

  3. 通常第二种方法会更好用,因为你可以对observable进行操作而不是阻塞。