RxJava+Retrofit 搭建網絡請求框架

前言

以前一直在簡書上寫文章,而後本身搭建博客,想了一下,其實更多的精力仍是應該放在學習上面,博客等就是分享本身的所學,一直認爲,我若是可以把文章寫的很明白了,本身也就掌握的差很少了,其次,不少東西本身也方便查看,加快開發的速度。php

Overview

Retrofit 與 RxJava 完美結合,支持斷點下載,上傳,支持緩存,自定義綁定生命週期.java

github地址android

效果圖

Download

Step 1. Add the JitPack repository to your build file

Add it in your root build.gradle at the end of repositories:git

allprojects {
	repositories {
		...
		maven { url 'https://www.jitpack.io' }
	}
}
複製代碼

Step 2. Add the dependency

dependencies {
        implementation 'com.github.JiangHaiYang01:RxHttp-RxJava:0.0.2'
}
複製代碼

Usage

基礎使用

配置retrifot

rxHttp = RxHttp.Builder()
    .baseUrl("https://www.wanandroid.com")
    .isLog(true)
    .level(HttpLevel.BODY)
    .writeTimeout(10)
    .readTimeout(10)
    .connectTimeout(10)
    .build(this)
複製代碼

get 網絡請求

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}")

 }
複製代碼

post網絡請求

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

有時候 在調試的時候可能須要將 網絡請求的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)
複製代碼

2020-06-04-15-32-48-1591255968

有時候可能不須要那麼多的日誌 可使用 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 註解失效

網絡cache

在構建 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 處理緩存時間等

  • cacheNetWorkTimeOut

有網時:特定時間以後請求數據;(好比:特定時間爲20s) 默認20

  • cacheNoNetWorkTimeOut

無網時:特定時間以前請求有網請求好的數據;((好比:特定時間爲30天) 默認30 天 單位(秒)

  • cacheSize

緩存大小 默認10M

  • cachePath

緩存位置 默認沙盒目錄下 cacheHttp 文件夾

Cookie 攔截器

fun addCookieInterceptor(
            cookieListener: OnCookieListener,
            onCookieInterceptor: OnCookieInterceptor
        )
複製代碼

下載安裝包

掃碼下載

License

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 纔是最後的王道,

相關文章
相關標籤/搜索