[Android開源框架]RxHttp使用說明
RxHttp
對RxJava2+Retrofit2+Okhttp的封裝,優雅實現介面請求和檔案下載
功能簡介
-
網路請求(RxRequest)
- 監聽請求宣告週期,如開始結束和網路錯誤等
- 支援多BaseUrl,可針對不同請求重定向
- 支援無網強制獲取快取資料
- 支援新增公共請求引數
- 支援自定義異常處理和異常提示訊息
-
檔案下載(RxDownload)
- 支援斷點續傳
- 支援下載進度回撥
- 支援下載速度回撥
整合方式
-
在Project的build.gradle 新增倉庫地址
allprojects { repositories { ... maven { url 'https://www.jitpack.io' } } }
-
在Model:app的build.gradle 新增框架依賴
最新版本是多少,看下Releases
dependencies { implementation '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 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 onDownloading() { log(null); log("onDownloading()"); timeStart = System.currentTimeMillis(); } @Override public void onError(ExceptionHandle handle) { log("onError(" + handle.getMsg() + ")"); } @Override public void onStopped() { long cast = System.currentTimeMillis() - timeStart; log("onStopped(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
用於初始化和設定
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()
超時時間
-
String getCacheDirName()
快取資料夾名
-
long getCacheSize()
快取大小
-
Map<String, String> getStaticPublicQueryParameter()
拼接在url後面的公共請求引數,靜態字串,如版本號等
-
Map<String, ParameterGetter> getDynamicPublicQueryParameter()
拼接在url後面的公共請求引數,需要動態獲取的,如使用者名稱等
-
< E extends ExceptionHandle> E getExceptionHandle()
獲取自定義異常處理器
-
Interceptor[] getInterceptors()
新增自定義攔截器
-
Interceptor[] getNetworkInterceptors()
新增自定義攔截器
ExceptionHandle
處理請求過程中的異常,可通過繼承自定義。
-
onGetCode(Throwable)
重寫該方法去返回異常對應的錯誤碼
-
onGetMsg(int)
重寫該方法去返回錯誤碼對應的錯誤資訊
Api
-
Header內部類
- BASE_URL_REDIRECT:用於BaseUrl的重定向
- CACHE_CONTROL_AGE:用於指定無網讀取快取
-
靜態方法api(Class< T> clazz)
建立Api介面例項
RxRequest
用於發起請求
-
create(Observable< R>)
建立例項,傳入引數為一個可觀察物件,應該為Api介面返回
-
listener(RequestListener)
監聽請求的生命週期
-
onDownloading()
請求開始
-
onError(ExceptionHandle)
請求出錯,請見ExceptionHandle
-
onStopped()
請求結束
-
-
request(ResultCallback< E>)
請求成功
-
onSuccess(int, E)
伺服器返回成功code
-
onFailed(int, String)
伺服器返回失敗code
-
JsonFieldUtils
建立Json結構的資料
ParameterUtils
構建Map<String, RequestBody>
RxDownload
使用方法
初始化
初始化操作可在Application中也可在應用啟動頁中進行
RxHttp.init(this); 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() { tv_start.setText("正在開始..."); } @Override public void onDownloading() { tv_start.setText("正在下載"); } @Override public void onError(Throwable e) { tv_start.setText("下載失敗"); } @Override public void onStopped() { tv_start.setText("已停止"); } @Override public void onCanceled() { 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) { pb_1.setProgress((int) (progress * 100)); } }) .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秒
-
String getSaveDirName()
指定預設的下載資料夾路徑
DownloadInfo
用於儲存下載資訊,如需斷點續傳,需要自己儲存以下幾個必傳項
-
String url
下載檔案的連結(必傳項)
-
String saveDirName
自定義下載檔案的儲存目錄(斷點續傳時必傳項)
-
String saveFileName
自定義下載檔案的儲存檔名,需帶字尾名(斷點續傳時必傳項)
-
long downloadLength
已下載檔案的長度(斷點續傳時必傳項)
-
long contentLength
下載檔案的總長度
-
State state
當前下載狀態
RxDownload
-
create(String)
用於新建一個下載任務,引數為下載地址
-
create(String, String, String)
用於新建一個下載任務,引數為下載地址、儲存目錄、儲存檔名
-
create(String, String, String,long)
用於新建一個斷點續傳下載任務,引數為下載地址、儲存目錄、儲存檔名、已下載長度
-
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()
取消下載,會刪除已下載的部分檔案,再次開始會重新下載