android的面试题,利用Kotlin和协程,腾讯Android开发面试凉凉

fun loadLiveData(): LiveData<Result<WanResponse<List>>> {

return apiLiveData(SupervisorJob() + Dispatchers.Main.immediate, timeoutInMs = 2000) {

service.getBanner()

}

}

在V层拿到LiveData后的操作如下:

viewModel.loadLiveData().observe(this, Observer {

when (it) {

is Result.Error -> {

hideLoading()

}

is Result.Response -> {

hideLoading()

it.response.apply {

showToast(Gson().toJson(this))

}

}

is Result.Start -> {

showLoading()

}

else ->{//冗余

}

}

})

显然这种方式的请求更适合轻量化的请求,适合拿到结果直接去渲染view不经过二次数据处理的场景。因为如上图所示在V层处理start、error回调感觉不是很友好,,在reponse中隐藏loading也是比较繁琐。但好处是V层直接可以拿到包含请求数据的LiveData,操作更加便捷。

关于Livedata的封装如下

protected fun apiLiveData(

context: CoroutineContext = EmptyCoroutineContext,

timeoutInMs: Long = 3000L,

request: suspend () -> Response

): LiveData<Result> {

return androidx.lifecycle.liveData(context, timeoutInMs) {

emit(Result.Start())

try {

emit(withContext(Dispatchers.IO) {

Result.Response(request())

})

} catch (e: Exception) {

e.printStackTrace()

emit(Result.Error(e))

} finally {

emit(Result.Finally())

}

}

}

此处的livedata是lifecycle-livedata-ktx,在配置了timeoutInMs后如果没有活跃的observers就会超时自动取消。在IO线程拿到请求的结果后包装成Result,像RxJava那样发射出来即可。为了保证返回的livedata中数据的一致性,start、error也被包装成了Result。

DSL封装示例


接下来我们以对okhttp和retrofit的请求配置来看下是怎么进行DSL封装的,不多说showcode。

class RequestDsl {

internal var buidOkHttp: ((OkHttpClient.Builder) -> OkHttpClient.Builder)? = null

internal var buidRetrofit: ((Retrofit.Builder) -> Retrofit.Builder)? = null

fun okHttp(builder: ((OkHttpClient.Builder) -> OkHttpClient.Builder)?) {

this.buidOkHttp = builder

}

fun retrofit(builder: ((Retrofit.Builder) -> Retrofit.Builder)?) {

this.buidRetrofit = builder

}

}

首先是DSL的配置类,主要有2个角色,一个是函数类型的buidOkHttp,一个是以buidOkHttp为参数的配置buidOkHttp的高阶函数okHttp。可见buidOkHttp变量是一个可空类型的输入和返回是非空的OkHttpClient.Builder类型的函数,既然是可空类型的我们在初始化调用时就可以选择配置OkHttpClient.Builder与否。

既然输入返回都是OkHttpClient.Builder我们就可以拿到既定的带有初始化配置的OkHttpClient.Builder进行进一部配置,只要最后返回OkHttpClient.Builder就好,同时OkHttpClient.Builder采用了建造者模式我们可以拿到builder引用之后进行二次配置最后原样返回builder的引用。

下面是初始化方法的具体实现

private fun initRequest(okHttpBuilder: OkHttpClient.Builder, requestDSL: (RequestDsl.() -> Unit)? = null) {

val dsl = if (requestDSL != null) RequestDsl().apply(requestDSL) else null

val finalOkHttpBuilder = dsl?.buidOkHttp?.invoke(okHttpBuilder) ?: okHttpBuilder

val retrofitBuilder = Retrofit.Builder()

.baseUrl(this.baseUrl)

.addConverterFactory(GsonConverterFactory.create())

.client(finalOkHttpBuilder.build())

val finalRetrofitBuilder = dsl?.buidRetrofit?.invoke(retrofitBuilder) ?: retrofitBuilder

this.retrofit = finalRetrofitBuilder.build()

}

这个方法就比较简单,requestDSL定义为可空类型,可以选择配置或者不进行额外配置。此时我们再看一下比较常用的apply方法的如下定义,我们在apply方法中就进入到了泛型T的内部空间,this关键字就指代的是泛型自己 ,可以在内部调用泛型的成员。

public inline fun T.apply(block: T.() -> Unit): T

相似的requestDSL也是和apply方法中的block是一样的类型。一旦选择了进行配置就可以像apply方法一样,在RequestDsl函数内部选择性的调用okHttp或者retrofit方法。那么在关于DSL方式请求调用也和配置请求一样如出一辙不再多说。

协程的使用


internal fun launch(viewModelScope: CoroutineScope) {

viewModelScope.launch(context = Dispatchers.Main) {

onStart?.invoke()

try {

val response = withContext(Dispatchers.IO) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

小福利:

在当下这个碎片化信息环境的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021大厂最新Android面试真题解析

Android大厂面试真题解析

各个模块学习视频:如数据结构与算法

算法与数据结构资料图

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
一线互联网架构师

这份体系学习笔记,适应人群:**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!点赞+评论即可获得!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值