小编use*_*102的帖子

使用RxJava + Retrofit为列表中的每个项目发出API请求

我试图通过链接多个改进的api调用来创建一个observable.步骤是:

  1. 使用api调用获取json对象列表
  2. 对于列表中的每个对象,再次进行api调用以获取有关该项目的更多详细信息
  3. 将从此新详细对象获取的数据写入磁盘上的文件(对于列表中的每个项目都会发生这种情况)
  4. 最后返回一个单独的对象的observable,该对象要求为每个先前的对象创建一个文件

这是我到目前为止:

public static Observable<DownloadedFiles> downloadFiles() {
    DownloadedFiles downloadedFiles = new DownloadedFiles();
    Observable.create(subscriber -> {
        return getRestService().getObjectList()
        .flatMapIterable(objects -> objects)
        .flatMap(objectLimited -> getRestService().getObject(objectLimited.getPath()))
        .doOnNext(objectFull -> {

            try {
                File file = new File();
                // Extract data from objectFull and write new file to disk
                // ...
                } catch (IOException e) {
                subscriber.onError(e);
            }

            downloadedFiles.putFile(file);
        })
        .toList()
        .map(objects -> downloadedFiles)
        .finallyDo(() -> {
            subscriber.onNext(downloadedFiles);
            subscriber.onCompleted();
        });
    });
}

@GET("/api/...")
Observable<List<Object>> getObjectList();

@GET("/api/.../{path}")
Observable<Object> getObject(@Path("path") String path);
Run Code Online (Sandbox Code Playgroud)

有人可以确认我使用了正确的操作员.谢谢 …

java android rx-java retrofit rx-android

6
推荐指数
1
解决办法
4083
查看次数

使用 OkHttp、Okio 和 RxJava 下载文件

我正在尝试使用 OkHttp 下载文件并使用 Okio 写入磁盘。我还为这个过程创建了一个 rx observable。它正在工作,但是它明显比我以前使用的(Koush 的 Ion 库)慢。

这是我创建可观察对象的方法:

public Observable<FilesWrapper> download(List<Thing> things) {
    return Observable.from(things)
        .map(thing -> {
            File file = new File(getExternalCacheDir() + File.separator + thing.getName());

            if (!file.exists()) {
                Request request = new Request.Builder().url(thing.getUrl()).build();
                Response response;
                try {
                    response = client.newCall(request).execute();
                    if (!response.isSuccessful()) new IOException();
                    else {
                        BufferedSink sink = Okio.buffer(Okio.sink(file));
                        sink.writeAll(response.body().source());
                        sink.close();
                    }
                } catch (IOException e) {
                    new IOException();
                }
            }

            return file;
        })
        .toList()
        .map(files -> new FilesWrapper(files);
}
Run Code Online (Sandbox Code Playgroud)

有谁知道是什么原因导致速度变慢,或者我是否错误地使用了操作员?

android rx-java okhttp okio rx-android

4
推荐指数
1
解决办法
6419
查看次数

如何将nullable类型传递给采用非null类型的函数?

如果我在通过之前进行空检查,这可能吗?例如:

fun main(args: Array<String>) {
    var num: Int? = null
    // Stuff happens that might make num not null
    ...
    if (num != null) doSomething(num)
}

fun doSomething(number: Int) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么编译器不允许我传递可空的内容,即使我检查它首先不是null.谁能解释一下?

kotlin

2
推荐指数
1
解决办法
3884
查看次数

标签 统计

android ×2

rx-android ×2

rx-java ×2

java ×1

kotlin ×1

okhttp ×1

okio ×1

retrofit ×1