以前一直在簡書上寫文章,而後本身搭建博客,想了一下,其實更多的精力仍是應該放在學習上面,博客等就是分享本身的所學,一直認爲,我若是可以把文章寫的很明白了,本身也就掌握的差很少了,其次,不少東西本身也方便查看,加快開發的速度。php
Retrofit 與 RxJava 完美結合,支持斷點下載,上傳,支持緩存,自定義綁定生命週期.java
github地址android
Add it in your root build.gradle at the end of repositories:git
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
複製代碼
dependencies {
implementation 'com.github.JiangHaiYang01:RxHttp-RxJava:0.0.2'
}
複製代碼
rxHttp = RxHttp.Builder()
.baseUrl("https://www.wanandroid.com")
.isLog(true)
.level(HttpLevel.BODY)
.writeTimeout(10)
.readTimeout(10)
.connectTimeout(10)
.build(this)
複製代碼
private fun getRequest() {
Log.i(TAG, "get 方法啓動 線程 ${Thread.currentThread().name}")
val data = rxHttp
.create()
.addParameter("k", "java")
.doGet(
parameter = "wxarticle/chapters/json", tClass = TestBean::class.java,
listener = object : OnHttpListener<TestBean>() {
override fun onSuccess(t: TestBean) {
log.text = t.toString()
}
override fun onError(e: Throwable) {
log.text = e.toString()
}
}
)
Log.i(TAG, "收到響應 $data thread ${Thread.currentThread().name}")
}
複製代碼
private fun postRequest() {
val data = rxHttp
.create()
.addParameter("title", "123456")
.addParameter("author", "123456")
.addParameter("link", "123456")
.doPost("lg/collect/add/json", TestBean::class.java, object : OnHttpListener<TestBean>() {
override fun onSuccess(t: TestBean) {
log.text = t.toString()
}
override fun onError(e: Throwable) {
log.text = e.toString()
}
})
}
複製代碼
說明github
create
方法建立一個請求 使用 addParameter
添加請求參數 使用 addHeard
添加請求頭 使用 bindEvent
綁定生命週期 使用 addFile
添加上傳的文件(在上傳時候使用纔有效)express
rxHttp.create().doDownLoad(info.taskId, info.url, getBasePath(this), info.saveName, this)
複製代碼
接口返回apache
interface DownLoadProgressListener {
/**
* 下載進度
*
* @param key url
* @param progress 進度
* @param read 讀取
* @param count 總共長度
* @param done 是否完成
*/
fun onUpdate(
key: String,
progress: Int,
read: Long,
count: Long,
done: Boolean
)
}
interface OnDownLoadListener : DownLoadProgressListener {
//等待下載
fun onDownLoadPrepare(key: String)
//進度
fun onDownLoadProgress(key: String, progress: Int)
//下載失敗
fun onDownLoadError(key: String, throwable: Throwable)
//下載成功
fun onDownLoadSuccess(key: String, path: String)
//下載暫停
fun onDownLoadPause(key: String)
//下載取消
fun onDownLoadCancel(key: String)
}
複製代碼
doDownLoadCancel(key: String)
複製代碼
doDownLoadPause(key: String)
複製代碼
doDownLoadCancelAll
複製代碼
doDownLoadPauseAll
複製代碼
private fun startUploadSuspend(info: UpLoadInfo) {
rxHttp.create()
.addFile("uploaded_file", File(info.path))
.addHeard("heard", "1")
.addParameter("parameter", "2")
.doUpload(
info.taskId,
"http://t.xinhuo.com/index.php/Api/Pic/uploadPic",
TestBean::class.java,
this
)
}
複製代碼
doUpLoadCancel(tag:String)
複製代碼
項目自己 加入瞭解析器json
client.addConverterFactory(GsonConverterFactory.create()) // json 解析器
client.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
複製代碼
若是想支持其餘解析器也是能夠的api
在 build RxHttp 的時候 使用 addBuilderClientListener
添加解析器緩存
eg:
rxHttp = RxHttp.Builder()
.baseUrl("https://www.wanandroid.com")
.isLog(true)
.level(HttpLevel.BODY)
.writeTimeout(10)
.readTimeout(10)
.connectTimeout(10)
.addBuilderClientListener(object : OnBuildClientListener {
override fun addBuildClient(): MutableSet<Any> {
return mutableSetOf(GsonConverterFactory.create(),RxJava2CallAdapterFactory.create())
}
})
.build(this)
複製代碼
···
.isLog(true)
.level(HttpLevel.BODY)
···
複製代碼
有時候 在調試的時候可能須要將 網絡請求的log 保存到 本地文件,這裏也提供接口,開發者可以使用 addLogListener
自行處理log文件
eg:
rxHttp = RxHttp.Builder()
.baseUrl("https://www.wanandroid.com")
.isLog(true)
.level(HttpLevel.BODY)
.writeTimeout(10)
.readTimeout(10)
.addLogListener(this)
.connectTimeout(10)
.build(this)
複製代碼
addLogFilter
自定添加過濾器eg:
rxHttp = RxHttp.Builder()
.baseUrl("https://www.wanandroid.com")
.isLog(true)
.level(HttpLevel.BODY)
.writeTimeout(10)
.readTimeout(10)
.addLogFilter(object :OnLogFilterListener{
override fun filter(message: String): Boolean {
if(message.contains("adb")){
return true
}
return false
}
})
.connectTimeout(10)
.build(this)
複製代碼
注意 上傳和下載的日誌已通過濾了,是不會顯示上傳和下載的日誌的,這裏主要是防止
@Steam
註解失效
在構建 RxHttp 的時候 使用 cacheType
方法,構建緩存策略
提供 4中緩存策略,默認是沒有網絡緩存的
enum class CacheType {
//不加入緩存的邏輯
NONE,
//有網時:每次都請求實時數據; 無網時:無限時請求有網請求好的數據;
HAS_NETWORK_NOCACHE_AND_NO_NETWORK_NO_TIME,
//有網時:特定時間以後請求數據; 無網時:無限時請求有網請求好的數據;
HAS_NETWORK_CACHE_TIME_AND_NO_NETWORK_NO_TIME,
//有網時:每次都請求實時數據; 無網時:特定時間以前請求有網請求好的數據;
HAS_NETWORK_NOCACHE_AND_NO_NETWORK_HAS_TIME,
//有網時:特定時間以後請求數據; 無網時:特定時間以前請求有網請求好的數據;
HAS_NETWORK_CACHE_TIME_AND_NO_NETWORK_HAS_TIME,
}
複製代碼
當使用cache 的時候 提供下面api 處理緩存時間等
有網時:特定時間以後請求數據;(好比:特定時間爲20s) 默認20
無網時:特定時間以前請求有網請求好的數據;((好比:特定時間爲30天) 默認30 天 單位(秒)
緩存大小 默認10M
緩存位置 默認沙盒目錄下 cacheHttp 文件夾
fun addCookieInterceptor(
cookieListener: OnCookieListener,
onCookieInterceptor: OnCookieInterceptor
)
複製代碼
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
複製代碼
更新的話仍是會放在 Github 上面。畢竟 Github 纔是最後的王道,