Скачать файл с процессом, используя RxJava2 - PullRequest
0 голосов
/ 02 мая 2018

Как видно из названия, я хочу скачать файл, используя RxJava2 и okhttp. А также процесс необходим.

На мой взгляд, поток данных String url -> Response -> умножить Float process.

Итак, сначала мне нужно Single, которое излучает Response.

Single.create((SingleOnSubscribe<Response>) emitter -> {
    emitter.onSuccess(xx);// or throw error
});

Далее мне нужно Flowable верно? Потому что я хочу передать информацию о процессах умножения в Observer.

Так вот, как я могу это сделать? Заранее спасибо.

EDIT

Я пытался конвертировать Single в Flowable.

Single.create((SingleOnSubscribe<Response>) emitter -> {
    emitter.onSuccess(xxx);// or throw error
}).toFlowable()
        .flatMap((Function<Response, Publisher<Float>>) response -> Flowable.create(xxx))
        .subscribe(process -> {});

}

Но я не знаю, подходит ли это так.

EDIT

Меня не волнуют подробности okhttp, и меня волнует только что-то, относящееся к RxJava, такое как Single и Flowable.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Если вы используете модификацию, вы можете попробовать это https://github.com/imfms/retrofit-rxjava-request-with-progress

Если не адаптировать один из базовых классов:

Сначала используйте okhttp async api. Второе использование rx планировщиков для асинхронного.

0 голосов
/ 11 мая 2018

Это пример того, как сделать это с Retrofit 2, OkHttp, Okio и RxJava.

import com.squareup.okhttp.ResponseBody;
import okio.BufferedSink;
import okio.Okio;
import retrofit.Response;
import retrofit.http.GET;
import retrofit.http.Query;
import rx.Observable;

interface ApiService {
    @GET("/media/download")
    Observable<Response<ResponseBody>> download(@Query("id") String id);
}

public Observable<File> download(String id) {
    return service.download(id)
        .flatMap(this::saveFile);
}

public Observable<File> saveFile(Response<ResponseBody> response) {
    return Observable.create((Observable.OnSubscribe<File>) subscriber -> {
        try {
            // you can access headers of response
            String header = response.headers().get("Content-Disposition");
            // this is specific case, it's up to you how you want to save your file
            // if you are not downloading file from direct link, you might be 
            // lucky to obtain file name from header
            String fileName = header.replace("attachment; filename=", "");
            // will create file in global Music directory, can be any other 
            // directory, just don't forget to handle permissions

            File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
                    .getAbsoluteFile(), fileName);

            // No space before "(Environment.DIRECTORY_MUSIC)"
            BufferedSink sink = Okio.buffer(Okio.sink(file));
            // you can access body of response
            sink.writeAll(response.body().source());
            sink.close();
            subscriber.onNext(file);
            subscriber.onCompleted();
        } catch (IOException e) {
            e.printStackTrace();
            subscriber.onError(e);
        }
    });
}
...