我是靠谱客的博主 心灵美蜗牛,这篇文章主要介绍Android Speedy网络请求库,现在分享给大家,希望可以做个参考。

因为在工作中使用的是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
28
RetrofitUtil.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
2
CoroutineScope(Dispatchers.MAIN).launch {}

秉着一字千金的宗旨,在尽量精简代码的前提下,我将Retrofit+协程+ViewModel封装成一个便捷、精简的网络库,调用代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
launch<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
29
class 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
8
Speedy.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
5
Speedy.NETWORK_ERROR_TOAST = false // 全局关闭 launch<ResponseResult<Any>>(false) { // 当前请求关闭 }

6、定制toast样式

复制代码
1
2
3
4
Speedy.instance.showToast = { ToastUtils.showShort(it) }

7、自定义Retrofit

项目不同对Retrofit的配置肯定不一样,可以通过以下方法配置

复制代码
1
2
3
4
5
6
Speedy.instance.init(this) { baseUrl("http://v.juhe.cn/") addConverterFactory(GsonConverterFactory.create()) client(OkHttpClient.Builder().build()) }

或者直接用自定义Retrofit

复制代码
1
2
Speedy.instance.init(this, mRetrofit)

使用指南

1、依赖

复制代码
1
2
implementation 'io.github.conerjoy:Speedy:1.0.5'

2、初始化

复制代码
1
2
3
4
5
6
7
8
9
10
Speedy.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
10
open 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
29
class 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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部