由于文章涉及到的仅仅点比较多、内容或许过长,能够根据自己的才调水平和了解程度分阶段跳着看。如有叙述的不正确的当地劳烦各位私信给笔者,万分感谢
由于时刻原因,笔者白天作业只需晚上闲暇时刻才调json是什么意思写作,所以更新频率应该在2-3天一篇,当然我也会尽量的使用时刻,争夺能够提前发布。为了便利阅读将本文章拆分个多个章节,依架构是什么意思据自己需求选择对应的章节,现在也仅仅现在笔者心里的一个大约目录,架构师究竟以更新为准:
- 史上最详Android版kotlin协程入门进阶实战(一) -> kotlin协程的根底用法
- 史上最电脑蓝屏详Android版kotlin协程入门进阶实战(二) -> kotlin协程的要害常识点开端阐明
- 史上最详Android版kotlin协程入门进阶实战(三) -> kotlin协程的异常处理
- 史jsonp上最详Android版kotlin协架构师和程序员的差异程入门进阶实战(四) -> 运用kotlin协程json开发Android的运用
- 史上最详Andr协程网订机票oid版kotlin协程入门进阶实战(五) -> kotlin协程的网络央架构求封装
- [史上最详Android版kotlin协程入门进阶实战(六) -> kotlin协程结合Jetpack及第三方结构的运用]
- [史上最详Android版kotlin协程入门进阶实战(七) -> 深化kotlin协程原理(一)]
- [史上最详Android版kotlin协程入门进阶实战(appearance八) -&g电脑开机黑屏t; 深化kojson是什么意思tlin协程原理(json格局怎样翻开二)]
- [史上最详Android版kotlin协程入门进阶架构规划实战(九) -> 深化kotlin协程原理(三)]
- [史上最详Android版kotlin协电脑怎样康复出厂设置程入门进阶实战(十) -> 深化kotlin协程原理(四)]
扩展系列
- 封装DataBinding让你少写万行代码
- ViewModel的日常运用封装
本章前语
本章节中除了会对协程做说json解析明外,不appointment会对其他引进的结构做阐明。文章是根据用户现已对这些结构有必定的入门根底上,对与结构怎样结合kotlin
协程的运用做一个引导。整个篇幅会有些长,咱们会appear在结合运用的一起,做一些架构上的封装,也是为了便利后续在实战的时分,咱们能更便利、直观的了解代码。
笔者也仅仅一个普普通通的开发者,架构上的规划不必定合理,咱们能够自行吸收文章精华,去糟粕。
kotlin协程的运用封装
在上一章节中,咱们jsonobject现已了解了协程在Activity
、Fragment
、Lifec电脑蓝屏ycle
、电脑怎样录屏Viewmodel
的根底运用,以及怎样简略的自界说一个协程。本章节中,咱们首要是做一些根底的封装作业。咱们将在上一章节的内容根底上,引进DataBinding
、LiveData
、Flow
等做一些根底封装。比方:Base类的界说,协程的运用封装,常用扩协程电话展函数等。
咱们先引进本章节所运用到的相架构师认证关库:
// Kotlin
implementation "org.jetbrains.kotl电脑怎样康复出厂设置in:kotlin-stdlib:1.4.32"
// 协电脑快捷键程中心库
implementati架构规划on "org.jetbrains.kotlinx:kotlinx-co电脑routineapp装置下载s-core:1.4.3"
// 协程Anappledroid支撑库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"
implementation "androidx.ac电脑快捷键tivity:acti架构规划vity-kt架构规划x:1.2.2"
implementation "androidx.fragment:fragment-ktx:1.3.3"
implementation "androidx.lifejsonobjectcycle:lifecycle-viewmodel-ktx:2.3.1"
implementation "androidx.lifecycle:l协程之窗ifecycle-runtime-ktx:2.3.1"
implementation "androidx.appreciatelifecycle:lifecy电脑cle-livedata-ktx:2.3.1"
// ok http
implementation "co架构规划m.squareup.okhttp3:okhttp:4.9.0"
implemjsonentation 'com.squareup.okhttpappear3:logging-interceptor:4.9.0'
// retrofit
implementatioapplen "com.squareup.retrofit2:retrofitjsonp:$retrofit电脑_version"
implementation "com.squareup.retrofit2:converter-sca协程网lars:$retrofit_versjson格局ion"
implem电脑c盘满了怎样整理entation "com.squareup.retrofit2:con协程verter-gson:$retrofit_version"
现在咱们就能够开端做一些根底的封装作业,一起在app的bulid电脑截图快捷键.gradle
文件中翻开dat架构规划aBindi协程网ng
的运用
android {
buildFeatures {
dataBinding = true协程电话
}
//省掉...
}
文章中根据DataBinding
的架构师认证运用,能够参看 封装DataBinding让你少写万行代码
ViewModel
的运用能够参看V架构图用什么软件做iewModel的日常运用封装
这两篇文章是为了本章节专门写的扩展性阅读。
最近由于电脑炸机了,信号输出不稳定,开端以为是显卡坏了,折腾了几天仍是没整好,究竟发现是主板json是什么意思被腐蚀导致线路缺点,当时用的主板停产很久了,究竟只能找个兼容的,等了几天才到货,究竟也导致本章节略微延迟了几天。电子产协程 线程品太脆弱了,必定要注意appointment防摔
、防磕appointment碰
、防腐蚀
!废话不多说,下面进入咱们今天的正题。
协程的常用环境
在实践的开电脑发进程中,咱们常常需求把耗时处理移到非主线程
上实施,等耗协程官网时操作异步完毕往协程官网后,再回到主线程
上改写界面。根据这些需求,咱们大致能够把运用协程的环境分为下面五种环境:
网络央求
回调处理
数据库操json格局转化作
文件操作
其他耗时操作
下面咱们首要对网络央求
这块进行处理。现在市面上大多数APP的在处理网络央求
时分,都是运用的RxJava
结合Retrofit
、OkHttp
进行网络央求处理。咱们究竟的目的也是运用协程
结合Retrofit
、okHttp
进行网络央求处理。
咱们在这儿仅仅针对Retrofit
、OkHttp
结合协程
、ViewModel
、LiveData
运用阐明,假定需求了解Retrofit
和okHttp
的原理,能够看看其他作者的原理分化文章。
协程在网络央求下的封装及运用
为了演示作用,笔者在万维易源申请了一面免费的气候appstoreAPI,咱们运用的接口地址:
http[s]://route.showapi.json格局com/9-2?showapi_appid=替换自己的值&showapi_sign=替换自己的值
此接口回jsonobject来的通用数据格局,其中showapi_res_body
回来的json内容比较多,笔者从中选择了咱们首要重视的几个字段:approach
参数称谓 | 类型 | 描绘 |
---|---|---|
showapi_res_body |
String | 音讯体的JSON封装,一切运用级的回来参数将嵌入此政策 。 |
showapi_res_code |
int | 查看错误码电脑c盘满了怎样整理 |
showapi_res_error |
String | 错误信息的电脑开不了机展现 |
{
"showapi_res_error":"",
"showapi_res_cjson文件是干什么的ode":0,
"s架构规划howapi_res_body":{
"time":"20210509180000", //预告发布时刻
"now":{
"wind_direction":"西风", //风向
"temperature_电脑c盘满了怎样整理time":"01:30", //取得气温的时刻
"json格局转化wind_power":"0级", //风力
"aqi":"30", //空气指数,越小越好
"sd":"40%", //电脑截图快捷键空气湿度
"w协程 线程eather_pi架构师薪酬一月多少c":"http://app1.showapi.com/weather/icon/day/00.png", //气候小图标
"weather":"晴", //气候
"rain":"0.0", //降水量(mm)
"temperature":"15" //气温
}
}
}
当然咱们还需求一个接收数据的政策,为了防止和其他库容jsonobject易弄混杂,咱们命名为CRespo架构是什么意思nse
,这个结构我电脑截图快捷键们都很了解:
data class CResponse<T>(
@SerializedName("showapi_res_code")
val code: Int,
@SerializedName("showapi_res_error")
val msg: String? = null,
@SerializedName("showap架构师i_reapp装置下载s_body")
val data: T
)
由于API回来的字段称谓实在是不符合笔者的胃口,并且用起来也不美丽。所以笔者经过approveGson
的注解SerializedName
将属性进行重命名。咱们在实践开发中常常也会遇到这种问题approach,相同能够经过这种办法进行处理。
data class Weather(
val now: WeatherDetail,
val time: Strin协程教育g
)
data class WeatherDetail(
val aqi: String,
val rain: String,
val sd: String,
val temperature: String,
@SerializedName("temperature_time")
val temper协程教育atureTime: String,
val weather: Stjsonobjectring,
@SerializedName("weather_pic")
val weatherPic协程网: String,
@SerializedName("wind_direction")
val windDirection: String,
@Sjson解析erializedName("windPowe协程教育r")
val windPower: String
)
然后咱们创立一下okHttp
、Retrofit
。在json格局转化Retrofit
2.6版json别往后咱们不再需求引进Retrofit
的coroutine-adapter
适配器库,咱们直架构师和程序员的差异接运用即可:
object ServerApi {jsonp跨域原理
val service: Corouti协程电话napp装置下载eService by lazy(LazyThreadSaapprovefetyMode.SYNCHRONIZED协程网订机票)json格局转化 {
build()
}
private fun build():CoroutineService{
val retrofit =架构师薪酬一月多少 Retrofit.Builder协程机票().apply {
baseUappreciaterl(HttpConstant.HTTP_SERVER)
client(OkHttpClientManager.mClient)
a架构规划ddConverterFactory(ScalarsConverterFactory.create())
addConverterFactory(GsonConverterFactory.create())
}.build()
return协程网订机票 retrofit.create(CoroutineService::class.java)
}
}
object HttpConstant {
internal val HTTP_SERVER = "https://route.showapi.com"
}
object OkHttpClientManager {
val mClient: OkHttpClie架构图制造nt byapprove lazy(LazyThreadSafetyMode.SYjson文件是干什么的NCHRONIZED) {
buildClient()
}
private fun buildClient(): OkHttpClient {
val logging = HttpLoggingInte电脑开机黑屏rceptor()approve
logging.level = if (BuildConfig.DEBUG) HttpLoggingIntapp装置下载erceptor.Level协程电话.BODY else Htt架构师需要把握哪些常识pLoggi协程 线程ngInterceptor.Level.NONE
return OkHttp协程机票Client.Builder().apply {
addInterceptor(CommonInterceptor())
addInterceptor(logging)
followSslRedirects(true)
}.build()
}
}
由于咱们在调用的气候API接口的时分showapi_appid
和showapi_sign
必传的值,所以咱们添加了一个CommonInterceptor
拦截器来共同处理:
class CommonInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chainapplication: Interceptor.Chain): Response {
val oldRequest = chain.request()
val httpUrl = oldRequest.url
val host = httpUrl.host
if (HttpConstant.HTTP_SERVER != hosjson解析t )架构规划 {
ret电脑快捷键urn chain.proceed(approacholdRequest)
}
val urlBuilder = httpUrl.newBuilder架构师()
//这儿填写自己申请appid和sign
urlBuilder.addQu架构图制造eryParameter("showapi_appid", SappearHOW_API_APPID)
urlBuilder.addQueryParameter("showapi_sign", SHOW_API_SIGN)
val request = oldRequest
.newBuilder()
.url(urlBuilder.build())
.build()
return chain.proceappeared(request)
}
}
为了json格局怎样翻开便利快速演示,笔者从央求的参数列表中只抽取了一个用来演示,接下来咱们界说咱们在央求需求经过Retrofit
运用的接口CoroutineService
:
央求参数 | 类型 | 描绘 |
---|---|---|
area |
String | 要查询的区域称谓 。 |
interfappearace CoroutineService {
@FormUrlEncoded
@POST("/9-2")
suspend fun getWeather(
@Field("area") area: String
): CResponse<Weather&g协程机票t;
能够看到咱们在运用Retrofit
结合协程运用时,咱们只需求在函数前添加suspend
要害字就能够,一起回来作用能够直接界说为,咱们需求从央求作用中解appstore析出来的数电脑蓝屏据政策,而不再是appear像曾经相同界说为Call<T>
。
到此为止,咱们根据根底数据的界说现已完毕了,下面咱们将正式进入咱们今天的主题。为了更加清楚的了解,笔者这儿不会选用直接一步到位的办法APP。那样或许会有很多人阅读了解起来有困难。笔者将会对央求进程进行一步一步的封装,这儿需求一点架构师和程序员的差异耐性。
咱们先创立一个Repository
来协程游览央求数据:
class WeatherRe协程apppository {
suspend fun getWeather(
area: String
)协程app: CResponse<We协程之窗ather>{
return ServerApi.service.getWeather(area)
}
}
一起在创立一个MainViewModel
来运用Repository
class Main架构师薪酬一月多少ViewModel(priAPPvate val repository: WeatherRep电脑怎样截图ository):jsonp跨域原理ViewModel() {
private val _weather:MutableLjson文件是干什么的iveData<W协程官网eather> = MutableLiveData()
val mWeather: LiveData<Weather> = _weather
fun getWeather(approach area: String){
requestMappstoreain {
val result = repository.getappointmentWeather(area)
_weather.postValue(result.dat协程网订机票a)
}
}
}
现在咱们就能够在MainActivity
中创立MainViewModel
来调用办法获取气候数据。咱们在创立json解析ViewModel
政策的时分不协程机票再运用电脑截图快捷键
V架构师认证iewModelProviders.json解析of(this).get(MainViewModel::class.java) 这种办法。而是运用activity-ktx
库中的viewModels
办法去创立:
public inline fun <reified VM : V架构iewModel> ComponentAjsonp跨域原理ctivity.viewModels(
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
defaultViewModelProviderFactory
}
return ViewModelLazy(VM::cjsonobjectlass, { viewModelStore }, factoryPromise)
}
这个办法需求咱们传入一个Factory
,咱们自己界说一个完毕:
object ViewModelUtils {
fun provideMainViewModelFactory(
): MainViewModelFactory {
retu电脑蓝屏rn MainapproveViewModelFactory(MainRepository()电脑快捷键)
}
}
cljson格局转化ass MaiappearancenViewMapp装置下载odelFactory(电脑
private val repository: MainRepository
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
overridjsonp跨域原理e fun <T : ViewModel> create(model协程之窗Cl电脑开不了机ass: Class<T>):架构师 T {
return MainapplicationViewModel(reposit电脑快捷键ory) as T
}
}
接下来咱们在MainActivity
运用,经过运用jsonpViewModelUtils
获取MainViewModelFactory
,然后运用viewModels
进行创立咱们需求的viewModel
政策:
class MainActivity : BaseActivity<ActivityMainBinding>() {
private val viewModel by viewModels<Mjson格局怎样翻开ainViewModel> {
ViewModelUtils.provideMainViewModelFactory()
}application
override fun initObserve() {
viejson格局怎样翻开wModel.mWeather.observe(this) {
mBinding.contentTv.text = "$it架构图"
}
}
override fun ActivityMainBinding.initBinding() {jsonp
this.mainViewModel = viewModel
}
}
initObserve
是咱们在BaseActivity
中界说的笼统办法。咱们只在activity_main.xml
简略界说了一个Textview
来闪现appear数据,尽管在XML中引进了mainViewModel
,可是为演示进程,咱们没有运用DataBinding
直接做数据绑定。而在实践开发中应该是运用DataBindin架构师薪酬一月多少g
直接在XML中数据绑定。
<?xml version="1架构师认证.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/ap架构规划k/res-auto"协程官网
xmlns:tools="http://schemas.android.com/tools">
<架构data>
<variable
name=协程教育"mainViewModel"
type="com.carman.kotlin.coroutine.协程之窗request.viewmodel.MainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
andro架构是什么意思id:layout_width="matc架构师和程序员的差异h_parent"
android:layout_height="match_parent"
tools:context=".ui.MainAct架构图用什么软件做ivity">
<TextView
android:id="@+id/content_tv"
android:layout_width="match_jsonobjectparent"
android:layout_height="wrap_content"
android:hint="这儿闪现获取到的数据"
android:textColor="@colorappear/black"
android:textSize="18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.con架构师薪酬一月多少straintlayout.widget.ConstraintLayout>
</layout>
咱们成功的央求到数据,并且闪现在咱们界面上。可是有个问题上咱们现架构图用什么软件做在的央求是没有做异常处理的。现在咱们处理下央求进程中的异常:
fun getjsonobjectWeather(area: String){
requestMain {
val result = try {
repository.getWeather(area)
} catch (e: Exception) {
when(e) {
is UnknownHostExcjson解析eption -> {
//...
}
//... 各种需求独自处理appearance的异常
is ConnectEx架构图用什么软件做ception -> {
/电脑怎样康复出厂设置/...
}
else ->{
//...
}
}
null
}
_weather.postValue(resu电脑开机黑屏l协程官网t?.data)
}
}
这种做法尽管处理了异常,可是十分丑陋,并且咱们需求在每一个央求当地写的时分,那将会是一个噩梦般的诅咒。
接下来将会是咱们的重点内容,笔者将会封装出三种方式的调用,开端的时分对应的场景运用即可。
高阶函数办法
这个时分咱们需json文件是干什么的求创立一个BaseRepository
来进行封装处理,电脑截图快捷键咱们经过onSuccess
获取成功的作用,经过onError
来处理针对此次央求的特有异常,以及经过onComplete
来处架构图理实施完毕的操作:
open class BaseRepository {
suspend inline fun <rappstoreeified T : Any> launchRequest(
crossinliAPPne block: suspend () -架构是什么意思> CResponse<T>,
noiappreciatenline onSuccess: ((T?) -> Uapprovenit)? = null,
noinline onError: ((Exception)-> Unit) ? = null,
n协程网订机票oijson文件是干什么的nline onComplete: (() -> Unit)? = null ){
try {
val respon电脑se = block()
onSucappstorecess?.inapplevoke(response?.data)
} catch (e: Exception) {
e.printStackTrace()
when (e) {
is UnknownHostException -> {
//...
}
//... 各种需求独自处理的异常
is ConnectException -> {
//...
}
else -&g架构师和程序员的差异t; {
//...
}
}
onError?.invoke(e)
}finally {
onComplete?.invoke()
}
}
}
这个时分咱们再修改一下WeatherRepository
中的getWeather
方电脑开不了机法,咱们需求经过launchRequest
来包裹一下央json格局怎样翻开求就能够:
suspend fun getWeather(
areajson格局: String,
onSuccess: (Weather?) -> Unit,
onError: (Exception) -> Un协程电话it,
onComplete: () -> Unit,
){
launchRequest({
ServerApi.service.getWeather(area)
}, onSuccess,onErapp装置下载ror, onComplete)
}
然后咱们修改一下MainViewModel
中的getWeather
办法,咱们在处json格局怎样翻开理异常的方位处理此次接口特有的异常即可,一起能够在央求json文件是干什么的完毕后做一些收尾作业:
fun getWeat协程appher(area: String) {
requestMain {
repository.getWeather(area, {
_w协程网订机票eather.postValue(it)
}, {
it.printStackTrace()
Log.d(Companion.TAG, "异常提示处理")
}, {
Log.d(TAG, "央求完毕,处理收尾作业")
})
}
}
一起除第一个实施央求的参数外,后边三个参数都能够传入为空完毕。防止在不需求处理成功,异常,实施完毕等操作的时分,呈现这种影响美丽的代码。假定咱们经过协程网sendData
服务器发送一个数据,这个数据是否处理成功咱们不需求关怀,这个时分咱们就能够如下操作:
fun sendData(data: String) {
requestMain {
repository.launchReque电脑怎样录屏st({
repository.sendData(data)
})
}
}
咱们再回过头来看看launchRequest
方架构图用什么软件做法,咱们在处理央求回来的作用时架构师需要把握哪些常识分直接就回来response
。可是实践开发中咱们一般在央求接口回来数据的时分,是需求判别接口数电脑截图快捷键ctrl加什么据情况code
值是成功的时分协程才调回来数据。
咱们本例中这个情况值是0
。这个时分咱们需求电脑开不了机处理一下添加一个处理respjsonobjectonse
的办法.咱们再修改一下launchRequest
办法:
suspend inline fun <reified T : Any> launchRequest(
crossinline block: suspendappear () -> CResponse<T>,
noinline onSuccess: ((T?) -> Unit)? = null,
noinline onError: ((Exception) -> Unit)? = null,
noinline onCojsonp跨域原理mplete: (() -> Unit)? = null
) {
try {
val re架构图用什么软件做sponse = block()
when (response.code) {
HttpConstant.OK -> {
val isListType = T::class.isSu协程bclassOf(List::class)
if (response.data == njson格局怎样翻开ull && isListType) {
onSuccess?.invoke(Collections.EMPTY_LIST as? T)
} else {
onSuccess?.invoke(response?.data)
}
}
else -> onError?.invoke(CException(response))
}
} catch (e: Excepapplicationtion) {
e.printStackTrace()
when (e) {
is UnknownHostException -> {
}
//... 各种需求独自处理的异常
is ConappreciatenectException -appstore> {
}
else -> {
}
}
onE架构规划rror?.invoke(e)
} finally {
onComplete?.invok协程机票e()
}
}
能够看到电脑快捷键咱们在处理response
的时分,咱们先经过判别回来的诗句类型是否为List
调集类型。假定是调集类型且数据回来了一个null
的时分,咱们就检验把一个的空调集转化为作用。
val isListType = T::class.isSubclassOf(List::class)
if (response.data == null && isLiappointmentstType) {
onSuccess?.invoke(Collections.EMPTY_LIST as? T)
} else {
onSuccess?.invoke(response?.json解析data)
}
多情况函数回来值办法协程网
上架构师面的封装办法咱们是经过kotlin的高阶approach函数去完毕的。假定咱们想直接经过央求作用的时分,再结合其他央求处理数据告诉界面改写的时分,上面就显得很费事,并且如同又走到的无限嵌套的坑里。
这个时分咱们就需求直接经过函数回来值来处理。现在咱们首要的创立一个D架构规划ataResult
来封装一下回来作用,我json解析们将回来的数据分成成功或许失利两种:
sealed class DataResult<out T> {
data class Success&appearancelt;out T>(va架构师l data: T) : DataResult<T>()
data class Error(val exception: Exception) : DataResult<Nothing>()
}
然然后在创立一个launchRequestForResult
把之前的launchRequesjson格局怎样翻开t
代码仿制过来稍作修改:
suspend inline fun <reified T : Any> launchRequestForResult(
noinline block: suspend () ->json格局怎样翻开; CResponse<T>
): DataResult<T> {
return try {
val response = block()
if (0 == respons协程电话e.code) {
val isListType = T::class.isSubclassOf(List::class)
if (response.data == null &&amjsonpp; isListType) {
DataRes电脑截图快捷键ult.Succe电脑截图快捷键ss(Collections.EMPTY_LIST as? T) as DataResult&jsonlt;T>
} else {
DataResult.Success(response.data)
}
} e协程 线程lse {
DataResult.Error(CException(response))
}
} catch (e: Exception) {
when (e) {
is UnknownHost协程机票Exception -> {
}
//... 各种需求独自处理的异常
is ConnectException -> {
}
else -&JSONgt; {
}
}
DataResult.Error(e)
}
}
我架构师认证们在电脑开机黑屏WeatherRepository
中再添加getWeather
办法,经过launchRequestForResult
来处理央求:
suspend fun getWeather(area: String): DataResult<We电脑开不了机ather> {
return launchRequestForResult {
ServerApi.service.getWeather(area)
}
}
然后咱们一起咱们也在MainViewModel
中添加一app装置下载个getWeatherForResult
办法,这个时分咱们就能够按咱们的常规的编写代码次第处理作用:
fun getWeatherForResult(area: Strjsonobjecting) {
requestMain {
val result = repository.getWeathe架构师认证r(area)
when(result){
is DataResult.电脑截图快捷键Success ->{
_weather.postValue(result.data)
}
is DataResult.Error ->{
Log.d(TAG, "${(res协程网订机票ult?.exception}")
}
}
}
}
当然,这种办法处理起来仍是相对有些繁琐,由于当咱们有多个央求是,咱们需求写多个when
来判别作用。那假定咱们也不想写这些模application板代码又该怎样处理呢
直接回来值的方协程app法
这个时分咱们就协程网订机票需求在launchRequestForResjsonpult
的根底前进一步的处理:
suspend inline协程之窗 fun <reifi架构师和程序员的差异ed T : An协程官网y> launchRequest(
crossinline block: suspend () -> CResponse<T>
): T? {
return try {
blojson文件是干什么的ck()
} catch (e: Exception) {
e.printStackTrace()
when (e) {
is UnknownHostException -> {
}
/协程app/... 各种需求单appreciate独处理的异常
is ConnectExceptio电脑快捷键n -> {
}
else -> {
}
}
throw e
}?.run {
if (0 == code) {
val isListType = T::class.isSubclassOf(List::class)
return if (data == null && isListType) {
Collections.EMPTY_L架构师薪酬一月多少IST as? T
} else {
data
}
} else {
throw CException(this)
}
}
}
由于考虑到实践开发环境中,咱们仍是或许需求在外部处理异常提示的所以在这儿仍是经过throw
从头抛出异常。appear假定外部不想处理非内接口CExcjson是什么意思eption
异常,能够电脑开机黑屏参看下面直接在catch
回来null
即可:
suspend inline fun <reified T : Any> launchRequest(
crossinline bl架构图制造ock: suspend () -> CResponse<T>
): T? {
return try {
block()
} catch (e: Exception) {
null
}?.run {
if (0 == code) {
val isListType = T::class.isSubclassOf(List::class架构师和程序员的差异)
if (data =approach= null && isListType) {
Collecti架构规划ons.EMPTY_LIST as?架构图制造 T
} else {
data
}
} else {
throw CException(this)
}
} ?: leapplet {
null
}
}
相同在WeatherRepository
中再添加g电脑开不了机etWeather
办法,经过获取回来值的launchRequest
来处理央求:
suspend fun getWeath电脑c盘满了怎样整理er(area: String): Weather?APP {
return launchRequest{
ServerApi.service.getWeather(area)
}
}
由于咱们在launchRequest
从头抛出了异常,所以咱们需求在央求的当地捕获架构图用什么软件做一下:
fun getWeather(area: String) {
requestMain {
val weather = try {
rep架构图用什么软件做ository.getW协程游览eather(area)
} catch (e: Exceptijson格局转化on电脑开不了机) {
//二appointment次异常处理...
}
}
}
上面的三种办法算上一种抛砖引玉,其实咱们还能够进一步的经过笼统ViewModel
来一协程网订机票致处理内部接口央求异常。
假定您有更好的办法或许思路主意,欢迎沟通。架构的演进以及代码的封装需求不断的学习和沟通,每一次常识沟通与磕碰都是有意义的。
原创不易。假定您喜欢这篇文章,您能够动动小手点赞保藏,您的煽动都将转化为我行进的动力。
- 史上最详Android版kotlin协程入门进阶实战(一) -> kotlin协approve程的根底用协程app法
- 史上最详Android版kotlijsonp跨域原理n协程入门进阶实战(二) -> kotlin架构是什么意思协程的要害常识点开端阐明
- 史上最详Android版kotlin协程入门进阶实战(三) -&gappstoretjson; kotlin协程的异常处理
- 史上最详Android版kotlin协程入门进阶实战(四) -> 运用approachkotlin协程开发Android的协程之窗运用
- 史上最详A架构图用什么软件做ndroid版kotlin协程入门进阶实战(五) -> kotlin协程的网络央求封装
扩展系列
-
封装DataBinding让你少写万行代码
-
ViewModel的日常运用封装