Kotlin协程(二)之——在Android当中应用
模拟网络请求
- kotlin 协程和
Retroft的结合使用将在下一篇文章演示,这里参照例子模拟本地请求
private fun refreshTitle() {
viewModelScope.launch {
try {
_spinner.value = true
repository.refreshTitle()
} catch (error: TitleRefreshError) {
_snackBar.value = error.message
} finally {
_spinner.value = false
}
}
}
suspend fun refreshTitle() {
withContext(Dispatchers.IO) {
val result = try {
network.fetchNextTitle().execute()
} catch (cause: Throwable) {
throw TitleRefreshError(“Unable to refresh title”, cause)
}
if (result.isSuccessful) {
wordDao.insert(Word(result.body()!!))
} else {
throw TitleRefreshError(“Unable to refresh title”, null)
}
}
}
// 这里通过拦截器用本地数据模拟网络请求
interface MainService {
@GET(“next_title.json”)
fun fetchNextTitle(): Call
companion object {
private const val BASE_URL = “http://localhost/”
fun create(): MainService {
val logger = HttpLoggingInterceptor()
logger.level = HttpLoggingInterceptor.Level.BASIC
val client = OkHttpClient.Builder()
.addInterceptor(logger)
.addInterceptor(SkipNetworkInterceptor())
.build()
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(MainService::class.java)
}
}
}
@InstallIn(SingletonComponent::class)
@Module
object NetworkModule {
…
@Provides
@Singleton
fun provideMainService(): MainService {
return MainService.create()
}
}
优化网络请求
@GET(“next_title.json”)
suspend fun fetchNextTitle(): String
suspend fun refreshTitle() {
try {
val result = network.fetchNextTitle()
wordDao.insert(Word(result))
} catch (cause: Throwable) {
throw TitleRefreshError(“Unable to refresh title”, null)
}
}
private fun refreshTitle() {
launchDataLoad {
repository.refreshTitle()
}
}
private fun launchDataLoad(block: suspend () -> Unit): Job =
viewModelScope.launch {
try {
_spinner.value = true
block()
} catch (error: TitleRefreshError) {
_snackBar.value = error.message
} finally {
_spinner.value = false
}
}
协程测试
// coroutineRule 是 TestWatcher的实现类,指定协程作用域
@Test
fun testDefaultValues() = coroutineRule.runBlockingTest {
viewModel.updateTaps()
Truth.assertThat(viewModel.taps.getOrAwaitValue()).isEqualTo(“0 taps”)
coroutineRule.testDispatcher.advanceTimeBy(1_000)
Truth.assertThat(viewModel.taps.getOrAwaitValue()).isEqualTo(“1 taps”)
viewModel.updateTaps()
coroutineRule.testDispatcher.advanceTimeBy(1_000)
Truth.assertThat(viewModel.taps.getOrAwaitValue()).isEqualTo(“2 taps”)
}
- 网络测试
最后
感觉现在好多人都在说什么安卓快凉了,工作越来越难找了。又是说什么程序员中年危机啥的,为啥我这年近30的老农根本没有这种感觉,反倒觉得那些贩卖焦虑的都是瞎j8扯谈。当然,职业危机意识确实是要有的,但根本没到那种草木皆兵的地步好吗?
Android凉了都是弱者的借口和说辞。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
所以,最后这里放上我耗时两个月,将自己8年Android开发的知识笔记整理成的Android开发者必知必会系统学习资料笔记,上述知识点在笔记中都有详细的解读,里面还包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝offer的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。
最后,赠与大家一句诗,共勉!
不驰于空想,不骛于虚声。不忘初心,方得始终。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
是现在。
最后,赠与大家一句诗,共勉!
不驰于空想,不骛于虚声。不忘初心,方得始终。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
更多推荐



所有评论(0)