我遇到了Room和RxJava2的严重问题。 我无法使用一些Rx代码在Room数据库上执行某些操作 实际问题出现在observables的连接中
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);
}
此代码的实际输出为:
实际
I / RespositorioCompra:darCompraPorFecha main
I / RespositorioCliente:Agregar elementoRxCachedThreadScheduler-1
I / RespositorioCompra:Agregar elemento RxCachedThreadScheduler-1
I / RespoCompraProducto:AgregarCompraProductos pool-1-thread-1
但这是所需的输出
I / RespositorioCliente:Agregar elementoRxCachedThreadScheduler-1
I / RespositorioCompra:Agregar elemento RxCachedThreadScheduler-1
I / RespositorioCompra:darCompraPorFecha RxCachedThreadScheduler-1 //实际上是在主
I / RespoCompraProducto:AgregarCompraProductos RxCachedThreadScheduler-1 //实际上是在pool-1-thread-1
I / RespositorioProducto:ActualizarProductos RxCachedThreadScheduler-1 //实际上甚至没有发生
答案 0 :(得分:0)
这个无法控制的问题的解决方案是使用@Transaction
在适当的DAO类中创建一个内部方法,并在那里执行与数据库相关的所有方法。