编程语言应用

首页 » 常识 » 诊断 » 在Android开发中使用协程代
TUhjnbcbe - 2021/2/14 10:46:00

本文是介绍Android协程系列中的第三部分,这篇文章通过发送一次性请求来介绍如何使用协程处理在实际编码过程中遇到的问题。在阅读本文之前,建议您先阅读本系列的前两篇文章,关于在Android开发中使用协程的背景介绍和上手指南。

使用协程解决实际编码问题

前两篇文章主要是介绍了如何使用协程来简化代码,在Android上保证主线程安全,避免任务泄漏。以此为背景,我们认为使用协程是在处理后台任务和简化Android回调代码的绝佳方案。

目前为止,我们主要集中在介绍协程是什么,以及如何管理它们,本文我们将介绍如何使用协程来完成一些实际任务。协程同函数一样,是在编程语言特性中的一个常用特性,您可以使用它来实现任何可以通过函数和对象能实现的功能。但是,在实际编程中,始终存在两种类型的任务非常适合使用协程来解决:

一次性请求(oneshotrequests)是那种调用一下就请求一下,请求获取到结果后就结束执行;

流式请求(streamingrequest)在发出请求后,还一直监听它的变化并返回给调用方,在拿到第一个结果之后它们也不会结束。协程对于处理这些任务是一个绝佳的解决方案。在这篇文章中,我们将会深入介绍一次性请求,并探索如何在Android中使用协程实现它们。

一次性请求

一次性请求会调用一次就请求一次,获取到结果后就结束执行。这个模式同调用常规函数很像——调用一次,执行,然后返回。正因为同函数调用相似,所以相对于流式请求它更容易理解。

一次性请求会调用一次就请求一次,获取到结果后就结束执行。

举例来说,您可以把它类比为浏览器加载页面。当您点击了这篇文章的链接后,浏览器向服务器发送了网络请求,然后进行页面加载。一旦页面数据传输到浏览器后,浏览器就有了所有需要的数据,然后停止同后端服务的对话。如果服务器后来又修改了这篇文章的内容,新的更改是不会显示在浏览器中的,除非您主动刷新了浏览器页面。尽管这样的方式缺少了流式请求那样的实时推送特性,但是它还是非常有用的。在Android的应用中您可以用这种方式解决很多问题,比如对数据的查询、存储或更新,它还很适用于处理列表排序问题。

问题:展示一个有序列表

我们通过一个展示有序列表的例子来探索一下如何构建一次性请求。为了让例子更具体一些,我们来构建一个用于商店员工使用的库存应用,使用它能够根据上次进货的时间来查找相应商品,并能够以升序和降序的方式排列。因为这个仓库中存储的商品很多,所以对它们进行排序要花费将近1秒钟,因此我们需要使用协程来避免阻塞主线程。在应用中,所有的数据都会存储到Room数据库中。由于不涉及到网络请求,因此我们不需要进行网络请求,从而专注于一次性请求这样的编程模式。由于无需进行网络请求,这个例子会很简单,尽管如此它仍然展示了该使用怎样的模式来实现一次性请求。为了使用协程来实现此需求,您需要在协程中引入ViewModel、Repository和Dao。让我们逐个进行介绍,看看如何把它们同协程整合在一起。

classProductsViewModel(valproductsRepository:ProductsRepository):ViewModel(){privateval_sortedProducts=MutableLiveDataListProductListing()valsortedProducts:LiveDataListProductListing=_sortedProducts/***当用户点击相应排序按钮后,UI进行调用*/funonSortAscending()=sortPricesBy(ascending=true)funonSortDescending()=sortPricesBy(ascending=false)privatefunsortPricesBy(ascending:Boolean){viewModelScope.launch{//suspend和resume使得这个数据库请求是主线程安全的,所以ViewModel不需要关心线程安全问题_sortedProducts.value=productsRepository.loadSortedProducts(ascending)}}}ProductsViewModel负责从UI层接受事件,然后向repository请求更新的数据。它使用LiveData来存储当前排序的列表数据,以供UI进行展示。当出现某个新事件时,sortProductsBy会启动一个新的协程对列表进行排序,当排序完成后更新LiveData。在这种架构下,通常都是使用ViewModel启动协程,因为这样做的话可以在onCleared中取消所启动的协程。当用户离开此界面后,这些任务就没必要继续进行了。LiveData

1
查看完整版本: 在Android开发中使用协程代