Función rxjava :: zip devuelve un resultado vacío

Estoy usando Rxjava con mi aplicación, así que puedo search mis datos desde el server de API diferente, para combinar el resultado usando la function "zip" y aquí está mi código: 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 } 

cuando llamo al resultado en ex: class 2 como esta

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

el resultado que obtuve fue una list de matriz vacía

aquí también mi class de arrayitem:

 data class arrayitem(var title: String) 

por cierto, en este bucle en la function ini_conection () se imprime normalmente el resultado que se almacena en x arraylist este es el ciclo: –

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

No puede get el resultado de la synchronization de inmediato. Debe esperar y usualmente solo se puede acceder por callback.

Cuando devuelve x, devuelve una matriz que se inicializa en:

 var x:ArrayList<arrayitem> = ArrayList() 

para get la x que llena el resultado, puede usar la interfaz o lambda para get su resultado.

aquí hay ejemplos usando 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) }) 

}

Y puedes usarlo así:

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

necesitas replantear tu código Como señaló @ egon12, primero devolverá x vacío y luego tal vez realice algunas operaciones en esa matriz en el bloque de suscripción.

Hay forms de resolver eso.

  1. el feo, puedes usar Observable.toBlocking() , que te hará ser del reactive code .

  2. Devuelve Observable<ArrayList<arrayitem>> de ini_conection() y suscríbase en otro lugar.

Normalmente, el segundo enfoque sería mejor utilizarlo, ya que podría operar observables y no bloquear.

  • RxJava cómo crear Observable a partir de una Suscripción
  • Usando RxJava para unir datos locales con datos remotos (o en caching)
  • kotlin grpc.StreamObserver para deletar en rx.PublishSubject
  • La subclass de class sellada de Kotlin debe convertirse a la class base si se proporciona como RxJava Observable
  • ¿Cómo se coordina una list de ejecuciones Completables con RxJava?
  • La biblioteca de Android no puede comstackr kotlin
  • llamar parte de la secuencia una vez con múltiples suscriptores?
  • Cómo get un tipo correcto al devolver Template <T?> Desde una function estática con null
  • Kotlin RxJava Bug Nullable
  • Obteniendo una IllegalStateException al usar la API People de Google a pesar de suscribirse a otro hilo usando RxJava
  • ¿Hay alguna manera de orderar las keys groupBy en rx-java / kotlin?