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一个管理自己所有子协程的能力。