RxHttp
對RxJava2+Retrofit2+OkHttp3的封裝,優雅實現介面請求和檔案下載
功能簡介
- 網路請求(RxRequest)
- 支援監聽請求宣告週期,如開始結束和網路錯誤
- 支援多BaseUrl,可針對不同請求重定向
- 支援針對不同請求設定不同快取策略,如無網強制獲取快取,有網快取有效10秒
- 支援新增公共請求引數
- 支援自定義異常處理和異常提示訊息
- 檔案下載(RxDownload)
- 支援斷點續傳
- 支援下載進度回撥
- 支援下載速度回撥
- 支援下載過程狀態監聽
- 支援在僅儲存下載路徑未儲存進度時自動恢復斷點續傳
- 支援自動獲取真實檔名
整合方式
-
在Project的build.gradle新增倉庫地址
allprojects { repositories { ... maven { url 'https://www.jitpack.io' } } } 複製程式碼
-
在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介面類
- 新建子類繼承自Api
- 定義一個內部類Service宣告請求(即Retrifit的CategoryService)
- 定義靜態無參方法返回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步處理:
- 在onCreate方法中(如果是Presenter中使用應該在其繫結到檢視時)呼叫RxLife.create()方法,該方法會返回一個RxLife例項mRxLife。
- 在onDestroy方法中(如果是Presenter中使用應該在其從檢視解除繫結時)呼叫mRxLife.destroy()方法,該方法會自動中斷所有未完成的請求,防止記憶體洩漏。
- 呼叫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)