1. 程式人生 > >retrofit+rxjava簡單實現網路訪問

retrofit+rxjava簡單實現網路訪問

首先需要新增一些依賴

    compile 'io.reactivex:rxandroid:1.2.0'
    compile 'io.reactivex:rxjava:1.1.5'
    compile 'com.google.code.gson:gson:2.4'
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.squareup.retrofit2:converter-jackson:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' compile 'com.squareup.okhttp3:okhttp:3.0.1' compile 'com.squareup.okhttp3:logging-interceptor:3.0.1' compile 'com.squareup.okio:okio:1.6.0'

然後自定義封裝一個網路訪問的類

public class NetManager {

    private NetService mNetService;
    /**
     * 設快取有效期為兩天
     */
private static final long CACHE_STALE_SEC = 60 * 60 * 24 * 2; /** * 查詢快取的Cache-Control設定,為if-only-cache時只查詢快取而不會請求伺服器,max-stale可以配合設定快取失效時間 * max-stale 指示客戶機可以接收超出超時期間的響應訊息。如果指定max-stale訊息的值,那麼客戶機可接收超出超時期指定值之內的響應訊息。 */ private static final String CACHE_CONTROL_CACHE = "only-if-cached, max-stale="
+ CACHE_STALE_SEC; /** * 查詢網路的Cache-Control設定,頭部Cache-Control設為max-age=0 * (假如請求了伺服器並在a時刻返回響應結果,則在max-age規定的秒數內,瀏覽器將不會發送對應的請求到伺服器,資料由快取直接返回)時則不會使用快取而請求伺服器 */ private static final String CACHE_CONTROL_AGE = "max-age=0"; private static volatile OkHttpClient sOkHttpClient; private static SparseArray<NetManager> sRetrofitManager = new SparseArray<>(HostType.TYPE_COUNT); public NetManager(int hostType){ Retrofit retrofit = new Retrofit.Builder().baseUrl(URLConstants.getHost(hostType)) .client(getOkHttpClient()).addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build(); mNetService=retrofit.create(NetService.class);//生成不同的service } private OkHttpClient getOkHttpClient() { if (sOkHttpClient == null) { synchronized (NetManager.class) { Cache cache = new Cache(new File(App.getAppContext().getCacheDir(), "HttpCache"), 1024 * 1024 * 100); if (sOkHttpClient == null) { sOkHttpClient = new OkHttpClient.Builder().cache(cache) .connectTimeout(6, TimeUnit.SECONDS) .readTimeout(6, TimeUnit.SECONDS) .writeTimeout(6, TimeUnit.SECONDS) .addInterceptor(mRewriteCacheControlInterceptor) .addNetworkInterceptor(mRewriteCacheControlInterceptor) .addInterceptor(mLoggingInterceptor).build(); } } } return sOkHttpClient; } /** * 雲端響應頭攔截器,用來配置快取策略 * Dangerous interceptor that rewrites the server's cache-control header. */ private final Interceptor mRewriteCacheControlInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!NetUtil.isNetworkAvailable()) { request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); Log.d("net","no network"); } Response originalResponse = chain.proceed(request); if (NetUtil.isNetworkAvailable()) { //有網的時候讀介面上的@Headers裡的配置,你可以在這裡進行統一的設定 String cacheControl = request.cacheControl().toString(); return originalResponse.newBuilder() .header("Cache-Control", cacheControl) .removeHeader("Pragma") .build(); } else { return originalResponse.newBuilder() .header("Cache-Control", "public, only-if-cached, max-stale=" + CACHE_STALE_SEC) .removeHeader("Pragma") .build(); } } }; private final Interceptor mLoggingInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Log.e("net",request.url()+""); long t1 = System.nanoTime(); Log.i("net",String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers())); Response response = chain.proceed(request); long t2 = System.nanoTime(); Log.i("net",String.format(Locale.getDefault(), "Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers())); return response; } }; /** * @param hostType NETEASE_NEWS_VIDEO:1 (新聞,視訊),GANK_GIRL_PHOTO:2(圖片新聞); * EWS_DETAIL_HTML_PHOTO:3新聞詳情html圖片) * 獲取不同的Service */ public static NetService getDefault(int hostType) { NetManager netManager = sRetrofitManager.get(hostType); if (netManager == null) { netManager = new NetManager(hostType); sRetrofitManager.put(hostType, netManager); } return netManager.mNetService; } /** * 根據網路狀況獲取快取的策略 */ @NonNull private String getCacheControl() { return NetUtil.isNetworkAvailable() ? CACHE_CONTROL_AGE : CACHE_CONTROL_CACHE; } }

定義一個介面的樣式

public interface NetService {

    /**
     * 載入圖片地址
     */
    @GET("data/福利/{pageCount}/{page}")
    Observable<PhotoEntity> getPhotoList(@Path("pageCount") int pageCount, @Path("page") int page);
}

最後進行網路訪問

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Observable<PhotoEntity> observable= NetManager.getDefault(HostType.GANK_GIRL_PHOTO).getPhotoList(10, 1).compose(TransformUtils.<PhotoEntity>defaultSchedulers());
                observable.subscribe(new NetBaseSubscriber<PhotoEntity>(getApplicationContext()) {
                    @Override
                    public void onStart() {
                        super.onStart();
                    }

                    @Override
                    public void onCompleted() {
                        super.onCompleted();
                    }

                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                    }

                    @Override
                    public void onNext(PhotoEntity photoEntity) {
                        super.onNext(photoEntity);
                        textView.setText(photoEntity.toString());
                    }
                });
            }
        });

下載地址

相關推薦

retrofit+rxjava簡單實現網路訪問

首先需要新增一些依賴 compile 'io.reactivex:rxandroid:1.2.0' compile 'io.reactivex:rxjava:1.1.5' compile 'com.google.code.gson:

Retrofit + Rxjava + RxAndroid實現網路請求

之前自己實現了一個新聞類閱讀APP,最近想使用當下流行的Retrofit + Rxjava + RxAndroid + MVP架構來重構一下,本文以每日一文作為資料來源API做一個簡單的示例,來介紹一下如何使用Retrofit + Rxjava + RxAndr

Retrofit+RxJava 簡單介紹

服務器 eight ons 內存 ret square blog base range Retrofit 是一個當前很流行的網絡請求庫   想使用它首先在gradle文件中引用    compile ‘com.squareup.retrofit2:retrofit:2.1

OKhttp、RXjavaretrofit網路訪問使用

兩個月沒有寫微博了,無論如何,現在再次迴歸Android的打怪升級。 關於Rxjava的學習和介紹,有興趣的可以去雲盤中提取pdf資料,這裡不做詳解,地址和提取碼如下:連結:http://pan.baidu.com/s/1skDOjN3 密碼: ajv7。 要想

Android 基於Retrofit+Rxjava搭建的簡單易用的網路架構

裝逼開始之前,為大家推薦兩篇文章,用來更好的學習Retrofit和Rxjava。在這裡我們要感謝網際網路裝逼行業勇於獻身,甘於奉獻的的大嬸們。我僅代表個人,給您們跪舔了。 ---------------這是分割線--------------- 首先配置支援的gradl

Android:RxJava 結合 Retrofit 優雅實現 網路請求輪詢

前言 Rxjava,由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發者的歡迎。 RxJava如此受歡迎的原因,在於其提供了豐富 & 功能強大的操作符,幾乎能完成所有的功能需求 今天,我將為

Retrofit + RxJava + OkHttp 讓網路請求變的簡單-封裝篇

前面一篇文章講了一下Retrofit+ RxJava 請求網路的一些基本用法,還沒有看過的可以去看一下Retrofit + RxJava + OkHttp 讓網路請求變的簡單-基礎篇,正如標題所說的,Retrofit+RxJava 是讓我們的網路請求變得簡單,程式碼精簡

簡單實現斷點續傳+MVP+Retrofit+RxJava

依賴: compile 'com.squareup.retrofit2:retrofit:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.s

Retrofit 2.0關於get和post的網路訪問簡單使用

Retrofit 2.0已經發布很久了,由於個人原因,現在才稍有接觸。其他地方關於這個框架的中文介紹都只是之言片語。使得學習起來比較麻煩一些。一般來說這種比較強大的框架,學習起來都有一些難度,有時候也只運用它的一個功能模組。最近由於工作需要我學習使用了這個框架來進行網路的g

Retrofit+Rxjava 網路請求的簡單封裝(一)(觀察者模式)

我通過公司一個上線App介面來進行Retrofit+Rxjava 的簡單學習 http://x-phone.cn/api/v1.0/DeletePrivateContact 當然你直接訪問上面的url是無法獲取伺服器Json資料的,因為是需要封裝請求體,

Android:RxJava 結合 Retrofit 全面實現 網路請求出錯重連

前言 Rxjava,由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發者的歡迎。 RxJava如此受歡迎的原因,在於其提供了豐富 & 功能強大的操作符,幾乎能完成所有的功能需求 今天,我將為

Retrofit+RxJava+Okhttp簡單實現登入註冊

首先匯入依賴: compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包 compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4

JSP簡單實現統計網頁訪問次數

setattr cat app spa int 應用 簡單 jsp 頁面 JSP簡單實現統計網頁訪問次數 需求:統計網頁的訪問次數 核心思想:利用application對象,將訪問次數的信息放入application對象中,每次訪問就+1。這裏利用了application對

AutoCompleteTextView+Okhttp3+ListView實現簡單網路資料搜尋展示

首先用OKHttp3獲取網路上的資料,並儲存到Serializeable的Bean類集合 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder()

Android RxJava 實戰系列:優雅實現 網路請求巢狀回撥

轉自-----http://blog.csdn.net/carson_ho/article/details/78315696,請為大神打call 前言 Rxjava,由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大 Android

Android RxJava 實戰講解:優雅實現 網路請求輪詢

轉自-----http://blog.csdn.net/carson_ho/article/details/78256466 前言 Rxjava,由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發者的歡迎。

阿里雲部署django實現公網訪問 SSH實現遠端控制 linux rhel7下安裝python django初探-建立簡單的部落格系統(一) django初探-建立簡單的部落格系統(二)

  本博的主要目的是對阿里雲部署django實現公網訪問進行一次簡單的記錄,方便日後查詢。   內容目錄:   (1)申請阿里雲伺服器及安全組配置   (2)實現ssh遠端控制   (3)實現ftp檔案傳輸   (4)安裝python3,在centos下同時使用python2和python3   

CNN卷積神經網路簡單實現模型

這是基於Mnist手寫識別的資料訓練的一個簡單的CNN卷積神經網路,可以直接在網上下載訓練資料集,但是經常會出現連線不到伺服器的提示,所以我下到本地進行資料的載入,下面程式碼的資料載入有問題,所以自己找了一些程式碼整出來了這個資料載入的辦法,連結為:https://blog.csdn.net/lxi

pytorch筆記:05)UNet網路簡單實現

語義分割的相關介紹可參考該部落格: https://blog.csdn.net/u012931582/article/details/70314859 程式碼參考圖1設計,黑色加粗的標註是筆者新增的,和程式碼中的變數對應 圖1 Unet

Retrofit+Rxjava+MVP網路請求框架

導言: 之前有套基於MVP的網路請求框架,是okhttp封裝的,後來由於retrofit,rxJava的流行,所以更改一部分來使用 釋義: retrofit:基於okhttp再次封裝的網路請求框架 rxjava:非同步工具庫,handler+thread->asyctask-&