【问题标题】:How to use doOnNext, doOnSubscribe and doOnComplete?如何使用 doOnNext、doOnSubscribe 和 doOnComplete?
【发布时间】:2020-01-05 23:04:09
【问题描述】:

RxJava2/RxAndroid 和 Android 开发新手,但对 Java 非常熟悉。 但是,在尝试“优化”并能够在对同一资源的大量调用之间更新 UI 时,我遇到了相当大的障碍。

我的代码如下:

private int batch = 0;
private int totalBatches = 0;
private List<ItemInfo> apiRetItems = new ArrayList<>();
private Observable<ItemInfo[]> apiGetItems(int[] ids) {
    int batchSize = 100;

    return Observable.create(emitter -> {
        int[] idpart = new int[0];

        for(int i = 0; i < ids.length; i += batchSize) {
            batch++;
            idpart = Arrays.copyOfRange(ids, i, Math.min(ids.length, i+batchSize));
            ItemInfo[] items = client.items().get(idpart);
            emitter.onNext(items);
        }
        emitter.onComplete();
    }).doOnSubscribe( __ -> {
        Log.d("GW2DB", "apiGetItems subscribed to with " + ids.length + " ids.");
        totalBatches = (int)Math.ceil(ids.length / batchSize);
        progressbarUpdate(0, totalBatches);
    }).doOnNext(items -> {
        Log.d("GW2DB", batch + " batches of " + totalBatches + " batches completed.");
        progressbarUpdate(batch, totalBatches);
    }).doOnComplete( () -> {
        Log.d("GW2DB", "Fetching items completed!");
        progressbarReset();
    });
}

如果我删除 doOnSubscribedoOnNextdoOnComplete,我在 Android Studio 中不会收到任何错误,但如果我使用其中任何一个,我会收到 Incompatible types. Required: Observable&lt;[...].ItemInfo[]&gt;. Found: Observable&lt;java.lang.Object&gt;

我正在使用 RxAndroid 2.1.1 和 RxJava 2.2.16。

有什么想法吗?

【问题讨论】:

    标签: rx-java2 rx-android


    【解决方案1】:

    由于您要添加方法调用链,编译器无法正确猜测Observable.create 中泛型参数的类型。您可以使用Observable.&lt;ItemInfo[]&gt;create(...) 显式设置它。

    【讨论】:

    • 谢谢!这解决了它,这是许多小时的搜索文档和教程没有做的! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多