Kotlin请求网络到返回的逻辑(简化版)

JSON 转Java Bean

  • 插件名称:GsonFormat
  • 插件文档:在 Bean 类中右击,选择 Generate -> GsonFormat,输入后台返回的 Json 数据即可转换成 Java Bean。

 请求网络过程,按着以下顺序写可以在上一层自动生成代码

1.Fragment

@Suppress("LABEL_NAME_CLASH", "DEPRECATION")
class NewHomeFragment :XXX {
    @Inject
    lateinit var viewModel: NewHomeViewModel

    private fun initView() {
        viewModel.getToast()
    }
}

 2.NewHomeViewModel   launch 创建的协程{}里面的内容

class NewHomeViewModel(
    private val handle: SavedStateHandle,
    private val presenter: NewHomePresenter
) : XXXViewModel() {

    fun getToast()=launch{
         presenter.getToast()
            .onSuccess {
            if(it.list.isNullOrEmpty()){
               return@onSuccess
            }
                info(it.list[0].content)

        }.onFailure {
                it.handle()
            }
    }
}

3.NewHomePresenter  协程会被suspend(被挂起) 挂起的定位: 暂时切走,稍后再切回来。

class NewHomePresenter @Inject constructor(private val homeFragmentService:HomeFragmentService) {
    suspend fun getToast()= safeApiCall {
        homeFragmentService.getToast()
    } 
}

 4.HomeFragmentService

interface HomeFragmentService {
      /**
     * 消息列表
     * @param body AssistantReminder
     * @return Response<List<ToastModel>>
     */
    @GET("/message/toast/list/")
    suspend fun getToast(): Response.List<ToastModel>
}

 5.ToastModel


@Keep
data class ToastModel(
    var content:String? = null,
    var type:String? = null
)

6.CoreViewModel

abstract class CoreViewModel : ViewModel(), CoroutineScope {

    private val rootJob = Job()

    override val coroutineContext: CoroutineContext
        get() = CoroutinesDispatchers.ui + rootJob

    @CallSuper
    override fun onCleared() {
        rootJob.cancel()
        super.onCleared()
    }
}

CoroutineScope可以理解为协程的作用域,可以管理其域内的所有协程。一个CoroutineScope可以有许多的子scope。

创建子scope的方式有许多种,常见的有:

  • 使用lauch, async 等builder创建一个新的子协程
  •  

CoroutineContext翻译为协程上下文。 我也找不到更好的词去翻译它。协程上下文包含当前协程scope的信息, 比如的Job, ContinuationInterceptor, CoroutineName 和CoroutineId。在CoroutineContext中,是用map来存这些信息的, map的键是这些类的伴生对象,值是这些类的一个实例。 这个设计也是蛮骚的, 导致你可以这样子取得context的信息:

Job

如上文提到的,Job继承了CoroutineContext.Element, 他是协程上下文的一部分。 Job有两个重要的子类实现:JobSupport,提供Job 的父子关系管理, 和AbstractCoroutine,即协程。

Job对象持有所有的子job实例,可以取消所有子job的运行。Job的join方法会等待自己以及所有子job的执行, 所以Job给予了CoroutineScope一个管理自己所有子协程的能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄毛火烧雪下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值