• 依赖添加

      1. //必须3个为必须
      2. implementation 'com.ljx.rxhttp:rxhttp:2.5.2'
      3. //rxhttp v2.2.2版本起,需要手动依赖okhttp
      4. implementation 'com.squareup.okhttp3:okhttp:4.8.1'
      5. kapt 'com.ljx.rxhttp:rxhttp-compiler:2.5.2' //生成RxHttp类
      6. //rxjava3
      7. implementation 'io.reactivex.rxjava3:rxjava:3.0.6'
      8. implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
      9. implementation 'com.ljx.rxlife3:rxlife-rxjava:3.0.0' //管理RxJava3生命周期,页面销毁,关闭请求
    • defaultConfig配置

      defaultConfig {
            applicationId "com.wsd.rxhttpdemo"
            minSdkVersion 21
            targetSdkVersion 30
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [
                            //使用asXxx方法时必须,告知RxHttp你依赖的rxjava版本,可传入rxjava2、rxjava3
                            rxhttp_rxjava: 'rxjava3'
                    ]
                }
            }
        }
      
    • 调用

      class MainActivity : AppCompatActivity() {
        // apk名字
        private var apkName = ""
        // apk地址
        private var apkUrl = ""
        // 进度
        private var progress:Int ?= 0
        // 当前下载进度
        private var currentSize:Long = 0
        // 下载总大小
        private var totalSize:Long = 0
        // 监听下载断点
        private var disposableSelf:Disposable?=null
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            getApk("softwareName","apk.apk")
            button.setOnClickListener {
                stopDownload()
            }
            button5.setOnClickListener {
                downLoadApk()
            }
        }
        // 请求下来APK名字与网址
        private fun getApk(softwareName:String,name:String){
            Log.e(TAG, "getApk: ")
            // 打开调试  就是可以看到日志输出
            RxHttp.setDebug(true)
            // post发送json请求
            RxHttp.postJson("http://192.168.0.12:2255/software/all")
                    // 添加参数  自动转变对象
                    .add(softwareName,name)
                    // 接受参数类型为对象  我这里用的是一个实体类
                    .asClass(GetApkList::class.java)
                    // 订阅回调
                    .subscribe({
                        Log.e(TAG, "getApk: $it")
                        apkName = it.data[0].softwareName
                        apkUrl = it.data[0].url
                        downLoadApk()
                    }, {
                        Log.e(TAG, "getApk: $it")
                    })
        }
      
        @SuppressLint("SdCardPath")
        // 本地目标路径
        private var path = "/mnt/sdcard/apk/apk"
        // 文件当前的大小
        private var length = File(path).length()
        private fun downLoadApk(){
            // 定义变量保存回调结果
            val disposable = RxHttp.get(apkUrl)
                    // 发送请求
                    .asAppendDownload(path,AndroidSchedulers.mainThread()){
                        progress = it.progress
                        currentSize = it.currentSize
                        totalSize = it.totalSize
                        Log.e(TAG, "downLoadApk: $progress")
                    }
                    // 感知生命周期 主线程回调
                    .life(this)
                    .subscribe({
                        Log.e(TAG, "成功: $it")
                    }, {
                        Log.e(TAG, "失败: $it")
                    })
            disposableSelf = disposable
        }
        // 暂停下载,若继续下载重新执行一下下载函数就好了
        private fun stopDownload(){
            if (disposableSelf?.isDisposed?.not() == true){
                disposableSelf?.dispose()
            }
        }
        companion object{
            const val TAG = "MainActivity"
        }
      }