'How to make a HTTP request to check a content type with RxJava 2?

I need to get the content type from a specific URL. I know that we can do it by simply coding:

URL url = new URL("https://someurl.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD"); // Request Method: GET/POST/UPDATE...
connection.connect();
String contentType = connection.getContentType();

Since this blocks the UI thread (a synchronous operation), how to make a HTTP request using RxJava 2 on Android?

Notes:

  • I don't want to make this using the AsyncTask. Why?
  • This is related to RxJava 2 and not version 1.
  • Give me a clear, simple and concise example if you can.


Solution 1:[1]

Use RxJava just operator to leave main thread and continue the process on thread from computation scheduler and then use flatMap to make http call and find content type, network calls should run on threads from IO scheduler and finally observe on main thread and subscribe to result.

Observable.just(1).subscribeOn(Schedulers.computation())
       .flatMap(dummyValueOne -> {
          return Observable.just(getContentType).subscribeOn(Schedulers.io()); 
       }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String contentType) throws Exception {
            //do nextsteps with contentType, you can even update UI here as it runs on main thread
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.e("GetContentType", "exception getting contentType", throwable);
                    }
                }));

Solution 2:[2]

You can use a Callable. Here's an example,

Observable.fromCallable((Callable<Object>) () -> {
    // do stuff
    return object;
})
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                // so that this can be properly disposed in onDestroy()
                compositeDisposable.add(d);
            }

            @Override
            public void onNext(@NonNull Object object) {
                // do stuff with the result
            }

            @Override
            public void onError(@NonNull Throwable e) {
            }

            @Override
            public void onComplete() {
            }
        });

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Arnav Rao
Solution 2 Sujit