I am trying to convert this working file download code to Reactive. But got stuck, due to my little knowledge of RxJava. Could you help me to make it Reactive?
public void downloadFile(MessageComponent media) {
Request request = new Request.Builder()
.url(media.getMediaUrl())
.build();
Call call = http_client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.e(TAG, "Failed to execute " + request, e);
}
@Override
public void onResponse(Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
String mimeType = MimeTypeMap.getFileExtensionFromUrl(media.getMediaUrl());
File file = new File(helper.getTmpFolder() + "/" + helper.generateUniqueName() + "test." + mimeType);
BufferedSink sink = Okio.buffer(Okio.sink(file));
sink.writeAll(response.body().source());
sink.close();
Log.d(TAG, "downloadFileFromServer done: " + media.getMediaUrl());
}
});
}
This is what I have written so far, and its not getting any result or error:
public void downloadFile(MessageComponent media){
Observable<String> downloadObservable = Observable.create(
sub -> {
Request request = new Request.Builder()
.url(media.getMediaUrl())
.build();
Response response = null;
try {
response = http_client.newCall(request).execute();
if (!response.isSuccessful()) new IOException();
} catch (IOException e) {
e.printStackTrace();
}
sub.onNext(response.toString());
}
);
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onNext(String responseString) {
Log.d(TAG, "works: " + responseString);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.e(TAG, e.getMessage(), e);
}
};
downloadObservable
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mySubscriber);
mySubscriber.unsubscribe();
}