如何正确调试rxjava2中的Completables,为什么没有人谈论链接它们?

时间:2018-05-31 19:22:30

标签: android rx-java2 rx-android android-room

我遇到了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 //实际上甚至没有发生

1 个答案:

答案 0 :(得分:0)

这个无法控制的问题的解决方案是使用@Transaction在适当的DAO类中创建一个内部方法,并在那里执行与数据库相关的所有方法。