我正在使用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)
}
答案 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
,然后可能在订阅块中对该数组进行一些操作。
有办法解决这个问题。
丑陋的,你可以使用Observable.toBlocking()
,这将使你成为reactive code
。
从Observable<ArrayList<arrayitem>>
返回ini_conection()
并在其他地方订阅。
通常第二种方法会更好用,因为你可以对observable进行操作而不是阻塞。