因为在工作中使用的是Retrofit+Rxjava发起网络请求,Rxjava很好很强大,美中不足的是代码量太大,如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28RetrofitUtil.getInstance().createService(BaseService.class) .doSomeThing(new Object()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(getView().bindToLifecycleDestroy()) .subscribe(new ResultObserver<Object>() { @Override public void onLoading(Disposable d) { } @Override public void onSuccess(Result<Object> result, Object object) { } @Override public void onApiError(Result<Object> result, int code, String msg) { } @Override public void onError(Throwable e) { } @Override public void onLoaded() { } });
Rxjava很多操作符Kotlin+协程完全能完美替代,例如:
复制代码
1
2.map((mapper) -> { return Object(); })
复制代码
1
2.let { Any() }
切换线程
复制代码
1
2.observeOn(AndroidSchedulers.mainThread())
复制代码
1
2CoroutineScope(Dispatchers.MAIN).launch {}
秉着一字千金的宗旨,在尽量精简代码的前提下,我将Retrofit+协程+ViewModel封装成一个便捷、精简的网络库,调用代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14launch<ResponseResult<Any>> { invoke { buildService<Test>().getSomething(mapOf("key" to "xxx")) }.onSuccess { _result use result.toString() }.onApiError(Dispatchers.IO) { LogUtils.e("业务错误") }.onError { LogUtils.e("请求错误") }.onComplete { LogUtils.e("请求结束") } }
功能介绍
1、ViewModel中使用
继承BaseVM,就能直接launch发起网络请求
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29class MainViewModel : BaseVM() { private val _result = MutableLiveData<String>() val result: LiveData<String> = _result fun getResult() { launch<ResponseResult<Any>> { invoke { buildService<Test>().getSomething(mapOf("key" to "xxx")) }.onSuccess { _result use result.toString() }.onApiError { LogUtils.e("业务错误") }.onError { LogUtils.e("请求错误") LogUtils.e(message) }.onComplete { LogUtils.e("请求结束") } } } @JvmSuppressWildcards interface Test { @FormUrlEncoded @POST("toutiao/index") suspend fun getSomething(@FieldMap map: Map<String, Any>): ResponseResult<Any> } }
2、单独使用
复制代码
1
2
3
4
5
6
7
8Speedy.instance.launch<ResponseResult<Any>> { invoke { buildService<MainViewModel.Test>().getSomething(mapOf("key" to "xxx")) }.onSuccess(Dispatchers.Main) { } }
3、请求结果
代码非常精简,每个状态方法都是可插拔的,需要则实现对应的方法
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15.onSuccess { _result use result.toString() }.onApiError(Dispatchers.IO) { LogUtils.e("业务错误") }.onError { LogUtils.e("请求错误") LogUtils.e(message) }.onComplete { LogUtils.e("请求结束") }.onErrorMessag { LogUtils.e("请求失败") }.onSuccessMessage { LogUtils.e("请求成功包含业务失败") }
4、线程切换
每个状态方法都可以入参CoroutineDispatcher对象,lambda函数就会切换到对应的线程,不传则默认是主线程
复制代码
1
2
3
4
5.onSuccess(Dispatchers.MAIN) { }.onApiError(Dispatchers.IO) {}
5、弱网、无网络提示
当前网络超时或者链接错误会toast提示,可通过以下方法关闭
复制代码
1
2
3
4
5Speedy.NETWORK_ERROR_TOAST = false // 全局关闭 launch<ResponseResult<Any>>(false) { // 当前请求关闭 }
6、定制toast样式
复制代码
1
2
3
4Speedy.instance.showToast = { ToastUtils.showShort(it) }
7、自定义Retrofit
项目不同对Retrofit的配置肯定不一样,可以通过以下方法配置
复制代码
1
2
3
4
5
6Speedy.instance.init(this) { baseUrl("http://v.juhe.cn/") addConverterFactory(GsonConverterFactory.create()) client(OkHttpClient.Builder().build()) }
或者直接用自定义Retrofit
复制代码
1
2Speedy.instance.init(this, mRetrofit)
使用指南
1、依赖
复制代码
1
2implementation 'io.github.conerjoy:Speedy:1.0.5'
2、初始化
复制代码
1
2
3
4
5
6
7
8
9
10Speedy.instance.init(this) { baseUrl("http://v.juhe.cn/") addConverterFactory(GsonConverterFactory.create()) } // Speedy.instance.init(this, mRetrofit) Speedy.instance.showToast = { ToastUtils.showShort(it) } Speedy.NETWORK_ERROR_TOAST = true // 全局生效
3、实现接口
复制代码
1
2
3
4
5
6
7
8
9
10open class ResponseResult<T> : SpeedyBean<T> { var reason: String = "" var result: T? = null var error_code: Int = -1 override fun isSuccess() : Boolean = error_code == 0 override fun message(): String = reason }
4、使用
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29class MainViewModel : BaseVM() { private val _result = MutableLiveData<String>() val result: LiveData<String> = _result fun getResult() { launch<ResponseResult<Any>> { invoke { buildService<Test>().getSomething(mapOf("key" to "xxxx")) }.onSuccess { _result use result.toString() }.onApiError { LogUtils.e("业务错误") }.onError { LogUtils.e("请求错误") LogUtils.e(message) }.onComplete { LogUtils.e("请求结束") } } } @JvmSuppressWildcards interface Test { @FormUrlEncoded @POST("toutiao/index") suspend fun getSomething(@FieldMap map: Map<String, Any>): ResponseResult<Any> } }
项目地址
SpeedySimple
最后
以上就是心灵美蜗牛最近收集整理的关于Android Speedy网络请求库的全部内容,更多相关Android内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复