У меня серьезная проблема с Room и RxJava2.Я не могу выполнить некоторые операции с базой данных Room с некоторым кодом Rx. Фактическая проблема возникает при объединении наблюдаемых
public void agregarCompraProductoYActualizarProductos(){ //THE PROBLEM IS ONLY HERE
Completable c = insertarClienteDummy().subscribeOn(Schedulers.io());
Completable c2 = insertarCompra().subscribeOn(Schedulers.trampoline());
Completable c3 = actualizarProductos().subscribeOn(Schedulers.trampoline());
c.andThen(c2)
.andThen(c3)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> irAFacturaActivity());
// Completable.concatArray(c, c2, c3) | This shows the same output
// .subscribe(() -> irAFacturaActivity());
}
private Completable insertarClienteDummy(){
Cliente cliente = new Cliente(111, "Juan");
Repositorio repo = new RepositorioCliente(getApplicationContext());
return repo.agregarElemento(cliente);
}
private Completable insertarCompra(){
String fecha = (String) DateFormat.format("yyyy-MM-dd hh:mm:ss a", Calendar.getInstance().getTime());
Repositorio repo = new RepositorioCompra(getApplicationContext());
Completable p = repo.agregarElemento(new Compra(0, 111, fecha))
.subscribeOn(Schedulers.trampoline());
RepositorioCompra repo2 = new RepositorioCompra(getApplicationContext());
Completable c = repo2
.darCompraPorFecha(fecha)
.subscribeOn(Schedulers.io())
.map(compra -> crearCompraProductosPorCodigoCompra(compra.getCodigo()))
.flatMapCompletable(compraProductos -> agregarCompraProductos(compraProductos))
.subscribeOn(Schedulers.trampoline());
return p.andThen(c);
}
private ArrayList crearCompraProductosPorCodigoCompra(int codigoCompra){
ArrayList<CompraProducto> compraProductos = null;
compraProductos = new ArrayList<CompraProducto>();
for (Producto p: productos) {
compraProductos.add(new CompraProducto(0, codigoCompra, p.getCodigo(), p.getCantidad()));
}
return compraProductos;
}
private Completable agregarCompraProductos(ArrayList<CompraProducto> compraProductos){
RepositorioCompraProducto repo = new RepositorioCompraProducto(getApplicationContext());
return repo.agregarCompraProductos(compraProductos.toArray(new CompraProducto[compraProductos.size()]));
}
private Completable actualizarProductos(){
RepositorioProducto repo2 = new RepositorioProducto(getApplicationContext());
return repo2.actualizarProductos(productos.toArray(new Producto[productos.size()]));
}
public void irAFacturaActivity(){
Intent i = new Intent(this, FacturaActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(PRODUCTOS, productos);
i.putExtras(bundle);
limpiarCache();
startActivity(i);
}
Фактический вывод этого кода:
Actual
I / RespositorioCompra: darCompraPorFecha main
I / RespositorioCliente: Agregar elementoRxCachedThreadScheduler-1
I / RespositorioCompra * Агрегат 1-го класса1 1013Shler/ RespoCompraProducto: AgregarCompraProductos pool-1-thread-1
Но это желаемый результат
I / RespositorioCliente: Agregar elementoRxCachedThreadScheduler-1
I/ RespositorioCompra: Agregar Elemento RxCachedThreadScheduler-1
I / RespositorioCompra: darCompraPorFecha RxCachedThreadScheduler-1 // На самом деле находится в основном
I / RespoCompraПроизводственный: 1-го класса - Агрегат-thread-1
I / RespositorioProducto: ActualizarProductos RxCachedThreadScheduler-1 // на самом деле этого даже не происходит