Как правильно отлаживать Completables в rxjava2, и почему никто не говорит о цепочке их? - PullRequest
0 голосов
/ 31 мая 2018

У меня серьезная проблема с 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 // на самом деле этого даже не происходит

1 Ответ

0 голосов
/ 01 июня 2018

Решением этой неконтролируемой проблемы было создание внутреннего метода в соответствующем классе DAO с @Transaction и выполнение там всех методов, связанных с базой данных.

...