Skip to content

基于kotlin 协程+ViewModel封装的网络请求库,提供数据分层处理,采取惰性启动的方式提供流式API

License

Notifications You must be signed in to change notification settings

Western-parotia/Net

Folders and files

NameName
Last commit message
Last commit date

Latest commit

accd348 · Apr 4, 2023

History

61 Commits
Apr 4, 2023
May 31, 2021
Jun 2, 2021
Apr 4, 2023
Apr 4, 2023
May 31, 2021
Apr 4, 2023
Apr 4, 2023
Nov 15, 2022
May 31, 2021
May 31, 2021
May 31, 2021
May 31, 2021
Apr 4, 2023

Repository files navigation

简介

基于kotlin 协程+ViewModel封装的网络请求库。

核心功能:

  • 1.service快速创建(带缓存)
  • 2.提供NetViewModel衔接网络状态拦截,数据分层解析,异常分层捕获。在框架层面避免数据逻辑代码冗余到View层
  • 3.域名切换 包含静态多域名 与动态多域名
  • 4.提供流式API

更新日志:

  • 1.0.6 更新:协程启动方式从立即启动改为惰性启动,需要主动掉用start()

引用:

 implementation("com.foundation.service:net:1.0.6")
仓库:(暂时还未迁移至中央Maven仓库)
https://packages.aliyun.com/maven/repository/2196753-release-jjUEtd/
访问权限账户密钥:
账号:642b9f209f62bf75b33fc1ae
密码:EkNR7ao]bCHh

功能结构图:

结构图

使用示例:

演示类:com.foundation.app.simple.demo.home.HomeActivity

  • 1、初始化
        val okHttpClient = OkHttpClient.Builder().addDynamicDomainSkill()
            .build()
        val retrofit = Retrofit.Builder()
            .client( okHttpClient)
            .baseUrl("https://www.xx.com")
            .build()
        NetManager.init(retrofit,application,BuildConfig.DEBUG)
  • 2、创建支持协程的网络请求接口
    @GET("banner/json")
    suspend fun getBanner(): Response<BaseApiResponse<List<BannerEntity>>>
  • 3、在NetViewModel子类中加载数据
netLaunch("加载banner") {
    val data = withBusiness {
        homeApi.getBanner()
    }
    _bannerData.value = data
}.onStart {

}.onSuccess {

}.onFailure { tagName, e ->

}.start()
//也支持一次性接管全部状态
//.start(your listener)

核心类:

1 NetRC

网络请求

/**
 * 采用惰性启动协程执行任务,掉用NetFuture.start()启动执行
 *
 */
private fun launch(
    block: suspend CoroutineScope.() -> Unit,
    tag: String,
    appointScope: CoroutineScope,
): NetFuture {
    val stateProxy = NetStateProxy()
    val exHandler = CoroutineExceptionHandler { ctx, throwable ->
        val name: String? = ctx[CoroutineName]?.name
        "ctxName:$name ,thread:${Thread.currentThread().name},$throwable ".log(TAG)
        val transformThrowable = transformHttpException(throwable)
        stateProxy.onFailure(tag, transformThrowable)
    }

    val ctx = exHandler + CoroutineName(tag)
    val job = appointScope.launch(ctx, start = CoroutineStart.LAZY) {
        stateProxy.onStart()
        if (!networkIsAvailable(NetManager.app)) {
            throw NetException.createNetWorkType("网络链接不可用")
        }
        block.invoke(this)
        stateProxy.onSuccess()
    }
    return NetFuture(job, stateProxy)
}

2 NetLinkErrorType

//默认异常状态,通常是发生在收到网络数据后,处理数据时异常:比如 json 解析出错
CODE_NORMAL(-900_0),

//网络不可用
CODE_NETWORK_OFF(-900_1),

//网络链接错误
CODE_CONNECT_ERROR(-900_2),

//网络响应错误
CODE_RESPONSE_ERROR(-900_3)

域名切换源码为开源库RetrofitUrlManager点击直达源码仓库

运行时切换域名使用示例:

  • 1 为Okhttp添加指定拦截器
OkHttpClient.Builder().addDynamicDomainSkill()

或者

NetManager.addDynamicDomainSkill(okhttpBuilder)
  • 1 切换指定了Domain-Name header的接口的域名

前置:必须要设置Domain-Name header

    @Headers("Domain-Name: searchDomain")//searchDomain 是替换域名时用于匹配接口的KEY
@GET("/")
suspend fun specialSearch(): Response<ResponseBody>

切换

 NetManager.putDomain("searchDomain", "https://www.bing.com")
  • 1 全局切换BaseUrl
 NetManager.setGlobalDomain("https://www.baidu.com")

切换时的优先级最低与Domain-Name header 只会切换所有没指定Domain-Name header的接口

被替换掉的BaseUrl就是下面代码中设置的baseUrl 参数

val retrofit = Retrofit.Builder()
    .client(okHttpClient)
    .baseUrl("https://www.google.com")
    .build()

About

基于kotlin 协程+ViewModel封装的网络请求库,提供数据分层处理,采取惰性启动的方式提供流式API

Resources

License

Stars

Watchers

Forks

Packages

No packages published