[Android開源框架]RxHttp使用說明

goweii發表於2018-10-18

RxHttp

對RxJava2+Retrofit2+OkHttp3的封裝,優雅實現介面請求和檔案下載

GitHub主頁

Demo下載

功能簡介

  • 網路請求(RxRequest)
    • 支援監聽請求宣告週期,如開始結束和網路錯誤
    • 支援多BaseUrl,可針對不同請求重定向
    • 支援針對不同請求設定不同快取策略,如無網強制獲取快取,有網快取有效10秒
    • 支援新增公共請求引數
    • 支援自定義異常處理和異常提示訊息
  • 檔案下載(RxDownload)
    • 支援斷點續傳
    • 支援下載進度回撥
    • 支援下載速度回撥
    • 支援下載過程狀態監聽
    • 支援在僅儲存下載路徑未儲存進度時自動恢復斷點續傳
    • 支援自動獲取真實檔名

整合方式

  1. 在Project的build.gradle新增倉庫地址

    allprojects {
    	repositories {
    		...
    		maven { url 'https://www.jitpack.io' }
    	}
    }
    複製程式碼
  2. 在Model:app的build.gradle新增框架依賴

    最新版本是多少,看下Releases

    dependencies {
    	api 'com.github.goweii:RxHttp:最新版本號'
    }
    複製程式碼

發起請求之RxRequest

使用方法

初始化

初始化操作可在Application中也可在應用啟動頁中進行

RxHttp.init(this);
RxHttp.initRequest(new DefaultRequestSetting() {
            @Override
            public String getBaseUrl() {
                return Config.BASE_URL;
            }

            @Override
            public int getSuccessCode() {
                return 200;
            }
        });
複製程式碼

定義響應體結構

定義ResponseBean< E>繼承BaseResponse< E>,定義成員變數並實現方法。

public class ResponseBean<E> implements BaseResponse<E> {
    @SerializedName(value = "code", alternate = {"status"})
    private int code;
    @SerializedName(value = "data", alternate = {"result"})
    private E data;
    @SerializedName(value = "msg", alternate = {"message"})
    private String msg;

    @Override
    public int getCode() {
        return code;
    }

    @Override
    public void setCode(int code) {
        this.code = code;
    }

    @Override
    public E getData() {
        return data;
    }

    @Override
    public void setData(E data) {
        this.data = data;
    }

    @Override
    public String getMsg() {
        return msg;
    }

    @Override
    public void setMsg(String msg) {
        this.msg = msg;
    }
}
複製程式碼

定義介面資料結構

public class TimeBean extends BaseBean {
    private String time;

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}
複製程式碼

定義Api介面類

  1. 新建子類繼承自Api
  2. 定義一個內部類Service宣告請求(即Retrifit的CategoryService)
  3. 定義靜態無參方法返回Api.api(Service.class)建立Api例項
public class FreeApi extends Api {

    public static Service api() {
        return Api.api(Service.class);
    }

    public interface Code{
        int SUCCESS = 200;
    }

    public interface Config {
        String BASE_URL = "http://api.apiopen.top/";
    }

    public interface Service {
        @GET("public/time")
        Observable<ResponseBean<TimeBean>> getTime();
    }
}
複製程式碼

發起請求

你可以在Activity或者Fragment中發起請求,也可以在你的Presenter層中發起請求,只需要注意請求生命週期的管理。

使用時分為3步處理:

  1. 在onCreate方法中(如果是Presenter中使用應該在其繫結到檢視時)呼叫RxLife.create()方法,該方法會返回一個RxLife例項mRxLife。
  2. 在onDestroy方法中(如果是Presenter中使用應該在其從檢視解除繫結時)呼叫mRxLife.destroy()方法,該方法會自動中斷所有未完成的請求,防止記憶體洩漏。
  3. 呼叫RxHttp.request(Observable)或者RxRequest.create(Observable)方法發起一個請求,會返回一個Disposable物件,呼叫mRxLife.add(Disposable)新增至管理佇列。
private RxLife mRxLife;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_request);
    mRxLife = RxLife.create();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mRxLife.destroy();
}

private void getTime() {
    mRxLife.add(RxHttp.request(FreeApi.api().getTime()).listener(new RxRequest.RequestListener() {
        private long timeStart = 0;

        @Override
        public void onStart() {
            log(null);
            log("onStart()");
            timeStart = System.currentTimeMillis();
        }

        @Override
        public void onError(ExceptionHandle handle) {
            log("onError(" + handle.getMsg() + ")");
        }

        @Override
        public void onFinish() {
            long cast = System.currentTimeMillis() - timeStart;
            log("onFinish(cast=" + cast + ")");
        }
    }).request(new RxRequest.ResultCallback<TimeBean>() {
        @Override
        public void onSuccess(int code, TimeBean data) {
            log("onSuccess(code=" + code + ",data=" + data.toFormatJson() + ")");
        }

        @Override
        public void onFailed(int code, String msg) {
            log("onFailed(code=" + code + ",msg=" + msg + ")");
        }
    }));
}
複製程式碼

常用類說明

RxHttp

用於初始化和設定

  • init(Context)

    初始化RxHttp,建議在自定義Application中進行

  • initRequest(RequestSetting)

    初始化RxRequest,建議在自定義Application中進行

  • initDownload(DownloadSetting)

    初始化RxDownload,建議在自定義Application中進行

  • request(Observable< R> )

    發起一個請求,同RxRequest.request(Observable< R> )方法

  • download(String)

    新建一個下載任務,同RxDownload.create(String)方法

RxLife

用於管理請求的生命週期,防止記憶體洩露。

  • RxLife create()

    在頁面的onCreate方法呼叫,會返回一個RxLife例項

  • destroy()

    在頁面的onDestroy方法呼叫,終止所有未完成的請求

  • add(Disposable)

    當呼叫RxHttp.request(Observable)或者RxRequest.create(Observable)方法發起一個請求時,會返回一個Disposable物件,呼叫該方法將其新增至管理佇列

RequestSetting/DefaultRequestSetting

RxRequest的配置引數

  • String getBaseUrl()

  • 預設的BaseUrl

  • Map<String, String> getMultiBaseUrl()

    其他用於重定向的BaseUrl,Map的Key值為新增重定向Header的Value值,Map的Value值為BaseUrl

  • int getSuccessCode()

    請求成功後伺服器返回的成功Code值

  • int[] getMultiSuccessCode()

    請求成功後伺服器返回的其他成功Code值

  • long getTimeout()

    預設超時時長,單位毫秒

  • long getConnectTimeout()

    設定0則取getTimeout(),單位毫秒

  • long getReadTimeout()

    設定0則取getTimeout(),單位毫秒

  • long getWriteTimeout()

    設定0則取getTimeout(),單位毫秒

  • String getCacheDirName()

    快取資料夾名

  • long getCacheSize()

    快取大小

  • Map<String, String> getStaticPublicQueryParameter()

    拼接在url後面的公共請求引數,靜態字串,如版本號等

  • Map<String, ParameterGetter> getDynamicPublicQueryParameter()

    拼接在url後面的公共請求引數,需要動態獲取的,如使用者名稱等

  • < E extends ExceptionHandle> E getExceptionHandle()

    獲取自定義異常處理器

  • Interceptor[] getInterceptors()

    新增自定義攔截器

  • Interceptor[] getNetworkInterceptors()

    新增自定義攔截器

BaseResponse< E>

伺服器響應體資料結構,可自定義欄位名

  • int getCode();

  • void setCode(int);

  • E getData();

  • void setData(E);

  • String getMsg();

  • void setMsg(Stringg);

BaseBean

響應體Data的資料結構,建議繼承自這個類,實現了Serializable介面,提供toJson方法

  • toJson()

    轉為Json字串

  • toFormatJson()

    轉為格式化後的Json字串,及花括號換行加縮排

ExceptionHandle

處理請求過程中的異常,可通過繼承自定義。

  • onGetCode(Throwable)

    重寫該方法去返回異常對應的錯誤碼

  • onGetMsg(int)

    重寫該方法去返回錯誤碼對應的錯誤資訊

Api

強烈建議建立Api例項的類繼承自該類。可在其中定義內部類介面管理常量資料,如:

public class FreeApi extends Api {
    
	// 定義靜態無參方法建立ApiService例項
    public static Service api() {
        return Api.api(Service.class);
    }

    public interface Code{
        // 定義伺服器返回的各種成功失敗的狀態碼
    }

    public interface Config {
        // 定義請求的各種配置資訊,如BASE_URL/TIMEOUT等
    }

    public interface Service {
        // 定義Retrofit的API宣告介面
    }
}
複製程式碼
  • Header內部類

    • BASE_URL_REDIRECT

      用於BaseUrl的重定向

    • CACHE_ALIVE_SECOND

      指定一個int值用於設定快取有效時長(秒)。配置後,在無網時強制使用快取資料,有網時,如果小於等於0則強制聯網獲取,大於0則在該時長內使用快取,過期後聯網獲取。

  • api(Class< T>)靜態方法

    建立Api介面例項

RxRequest

用於發起請求

  • create(Observable< R>)

    建立例項,傳入引數為一個可觀察物件,應該為Api介面返回

  • listener(RequestListener)

    監聽請求的生命週期

    • onStart()

      請求開始

    • onError(ExceptionHandle)

      請求出錯,請見ExceptionHandle

    • onFinish()

      請求結束

  • request(ResultCallback< E>)

    請求成功

    • onSuccess(int, E)

      伺服器返回成功code

    • onFailed(int, String)

      伺服器返回失敗code

JsonFieldUtils

建立Json結構的資料

ParameterUtils

構建Map<String, RequestBody>

檔案下載之RxDownload

使用方法

初始化

初始化操作可在Application中也可在應用啟動頁中進行

RxHttp.init(this);
// 可選,未配置設定將自動採用DefaultDownloadSetting
RxHttp.initDownload(new DefaultDownloadSetting() {
            @Override
            public long getTimeout() {
                return 60000;
            }
        }); 
複製程式碼

呼叫

RxDownload mRxDownload = RxDownload.create(et_url.getText().toString())
        .setDownloadListener(new RxDownload.DownloadListener() {
            @Override
            public void onStarting(DownloadInfo info) {
                tv_start.setText("正在開始...");
            }

            @Override
            public void onDownloading(DownloadInfo info) {
                tv_start.setText("正在下載");
            }

            @Override
            public void onError(DownloadInfo info, Throwable e) {
                tv_start.setText("下載失敗");
            }

            @Override
            public void onStopped(DownloadInfo info) {
                tv_start.setText("已停止");
            }

            @Override
            public void onCanceled(DownloadInfo info) {
                tv_start.setText("已取消");
                pb_1.setProgress(0);
            }

            @Override
            public void onCompletion(DownloadInfo info) {
                tv_start.setText("下載成功");
            }
        })
        .setProgressListener(new RxDownload.ProgressListener() {
            @Override
            public void onProgress(float progress, long downloadLength, long contentLength) {
                pb_1.setProgress((int) (progress * 10000));
            }
        })
        .setSpeedListener(new RxDownload.SpeedListener() {
            @Override
            public void onSpeedChange(float bytePerSecond, String speedFormat) {
                tv_start.setText("正在下載(" + speedFormat + ")");
            }
        });

tv_start.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mRxDownload.start();
    }
});

tv_stop.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mRxDownload.stop();
    }
});

tv_cancel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mRxDownload.cancel();
    }
});
複製程式碼

常用類說明

RxHttp

用於初始化和設定

DownloadSetting/DefaultDownloadSetting

RxDownload的設定

  • String getBaseUrl()

    指定預設BaseUrl,傳入一個合法的就可以了

  • long getTimeout()

    指定超時時間,建議長一點,如60秒

  • long getConnectTimeout()

    設定0則取getTimeout(),單位毫秒

  • long getReadTimeout()

    設定0則取getTimeout(),單位毫秒

  • long getWriteTimeout()

    設定0則取getTimeout(),單位毫秒

  • String getSaveDirPath()

    指定預設的下載資料夾路徑

  • DownloadInfo.Mode getDefaultDownloadMode()

    獲取儲存路徑的檔案已存在但未儲存下載進度時的預設模式

DownloadInfo

用於儲存下載資訊,如需斷點續傳,需要自己儲存以下幾個必傳項

  • String url

    下載檔案的連結**(必傳項)**

  • String saveDirPath

    自定義下載檔案的儲存目錄**(斷點續傳時必傳項)**

  • String saveFileName

    自定義下載檔案的儲存檔名,需帶字尾名**(斷點續傳時必傳項)**

  • long downloadLength

    已下載檔案的長度**(斷點續傳時必傳項)**

  • long contentLength

    下載檔案的總長度

  • State state

    當前下載狀態

    • STARTING

      正在開始

    • DOWNLOADING

      正在下載

    • STOPPED

      未開始/已停止

    • ERROR

      下載出錯

    • COMPLETION

      下載完成

  • Mode mode

    獲取儲存路徑的檔案已存在但未儲存下載進度時的模式

    • APPEND

      追加

    • REPLACE

      替換

    • RENAME

      重新命名

  • create(String)

    建立一個下載物件,引數為url

  • create(String, String, String)

    建立一個下載物件,引數為url/儲存目錄/檔名

  • create(String, String, String, long, long)

    建立一個下載物件,引數為url/儲存目錄/檔名/已下載長度/總長度

RxDownload

  • create(DownloadInfo)

    用於新建一個下載任務

  • setDownloadListener(DownloadListener)

    設定下載狀態監聽

    • onStarting()

      正在開始,正在連線伺服器

    • onDownloading()

      正在下載

    • onStopped()

      已停止,不會刪除已下載部分,支援斷點續傳

    • onCanceled()

      已取消,會刪除已下載的部分檔案,再次開始會重新下載

    • onCompletion(DownloadInfo)

      下載完成

    • onError(Throwable)

      下載出錯

  • setProgressListener(ProgressListener)

    • onProgress(float)

      下載進度回撥(0~1)

  • setSpeedListener(SpeedListener)

    • onSpeedChange(float, String)

      下載速度回撥,兩個值分別為每秒下載位元數和格式化後速度(如:1.2KB/s,3.24MB/s)

  • start()

    開始下載/繼續下載

  • stop()

    停止下載,不會刪除已下載部分,支援斷點續傳

  • cancel()

    取消下載,會刪除已下載的部分檔案,再次開始會重新下載

UnitFormatUtils

單位格式化工具

  • calculateSpeed(long, float)

    計算速度

  • formatSpeedPerSecond(float)

    格式化速度(如:1.12MB/s,628KB/s)

  • formatSpeed(float,TimeUnit)

    格式化速度(如:1.12MB/s,628KB/s)

  • formatBytesLength(float)

    格式化位元值(如:12.1KB,,187.24MB,154GB)

  • formatTimeUnit(TimeUnit)

    格式化時間單位(如:秒為s,毫秒為ms)

相關文章