2017-07-28 74 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); 
        } 
       })); 
相關問題