2017-07-28 73 views
0

我需要从特定的URL获取内容类型。我知道,我们可以通过简单的编码做到这一点:如何使用RxJava 2检查内容类型的HTTP请求?

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(); 

由于该块UI线程(同步操作),如何让Android上使用RxJava 2 HTTP请求?

注:

  • 我不想让这个使用的AsyncTask。 Why?
  • 这与RxJava 2相关,而不是版本1.
  • 如果可以的话,给我一个清晰,简单和简明的例子。
+1

请注意,Dan Lew在该博客文章中引用的'AsyncTask'的所有问题都可以克服,而使用RxJava 2则需要采取类似的步骤。 RxJava,即使是RxAndroid,也不是什么“奇迹般的治疗方法”。这当然是一个很好的方法,并且可以随意使用它。但个人而言,我不会因为'HttpURLConnection'而烦恼。 FWIW,[这里是一个示例应用程序](https://github.com/commonsguy/cw-graphql/tree/v0.2/Trips/CW/DynamicOk)使用RxJava/RxAndroid与OkHttp发出HTTP请求(具体来说是一个GraphQL端点)。 – CommonsWare

回答

0

使用RxJava只是经营者离开主线程,继续线程的进程从计算调度,然后用flatMap进行HTTP调用和查找内容类型,网络电话应该从IO调度线程中运行最后观察主线程和订阅结果。

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); 
        } 
       })); 
相关问题