翻译自:https://medium.com/androiddevelopers/coroutines-patterns-portns-pork-that-said-bebecance-e26c40f142ad
标题:应有的工作和模式
子幕:取消和统一的异常(第4部分)
在本系列的第二篇文章中(取消和异常情况),我们了解了及时取消公司的重要性。在Android中,您可以使用JetPack提供的CoroutinesCope:ViewModelScope或Lifecyclescope。当他们的范围完成后,他们将自动取消所有公司。也就是说,当活动,碎片和生命周期结束时,所有的工作都在执行。如果您自己创建一个CoroutinesCope,那么请确保保存工作实例当启动按下时,并在不需要时呼叫取消呼叫取消。
但是,在某些情况下,您要完成所有操作,即使用户离开了此活动,也不要将所有操作取消。例如,编写数据库或将网络请求启动到服务器。Lifecyclescope已完成,它将掉落。然后我有一份重要的工作。坎塞尔的行动需要在科鲁特举行的合作)。现在是什么?
继续阅读,您将学习如何解决上述问题。
如果您需要一个生命周期,则需要比应用程序进程(例如将日志发送到服务器)的运行时间更长,然后使用workmanager.workmanager是一个库,用于将来在某个时间执行密钥操作。
只要应用程序还活着,Coroutine就可以运行。对于需要在当前过程生命周期中有效的操作,当用户杀死应用程序时,可以取消网络请求以获取新闻列表数据)。
如果我们的应用程序中有一个ViewModel和一个存储库,则逻辑如下:
我们不希望通过ViewModelScope控制非常iMportorStoperation(),因为它可以随时取消。我们希望此操作比ViewModelsCope的生命周期更长。我们该怎么做?
因此,请在应用程序类中创建自己的范围,并在Coroutine中调用这些重要操作。该类需要使用范围并直接从应用程序中获取。
与我们稍后会看到的其他解决方案相比(例如GlobalsCope),创建自己的CoroutinesCope的优点是您可以根据需要进行配置。将所有常见的配置放在其Coroutinecontext中,这非常方便。
您可以称呼它为应用程序,并且必须包含一个用于公司校正异常的主管()不会在层次结构中传播(如本系列的第三篇文章所示)。
我们不需要取消范围,因为我们希望只要申请过程还活着,它仍然活跃,因此我们不持有Subersorjob的报价。我们可以使用此范围来运行Coroutine,通常需要设备的寿命更长(例如ViewModel,活动,碎片等)。
对于不应取消的操作,请从应用程序创建CoroutinesCope,然后使用CoroutinesCope创建公司来调用它们。
每当创建新的重新定案实例时,请将其传递到我们上面创建的应用程序中。
根据非常重要的植物()的行为,您需要使用启动或异步来开始根据需要启动新的校正:启动或异步:
以下是您将使用启动来启动Coroutine的方式:
或者您使用异步:
在使用ViewModelScope调用上述双重模型之后,无论如何,即使ViewModelScope被销毁,它也不会影响ExternalScope的执行。加法,Double()不会像其他任何其他吊销一样返回()功能调用。
另一种使用方法是与context一起使用,然后在外部cope ::中包裹非常象征的poperation()()
但是,这样,有些地方需要注意:
实际上,还有其他方法可以让我们使用公司实现这一行。它被使用或不使用。
这里的s GlobalsCope在这里有几个原因,为什么您不应该使用GlobalsCope:
建议:请勿直接使用GlobalsCope。
S ProcessLifeCycleOwner范围在Android中,库中有一个应用程序,可以通过访问访问。
在这种情况下,您需要传递生命周期者,而不是我们先前介绍的coroutinescope。在生产环境中,您需要传递到ProcessLifeCycleOnder.get()。
请注意,此范围的默认coroutinecontext使用dispatcherss.main.imedied,这可能不适合背景工作。例如,像GlobalScope一样,您必须将公共Coroutinecontext传递给全球范围内的全部Coroutines。
由于上述所有原因,在应用程序类中创建CoroutinesCope更加麻烦。此外,我个人不喜欢在ViewModel或演示者层下与Android Lifecycle建立关系。我希望这些级别与平台无关。
建议:不要直接使用它。
特别说明
如果直接将直接分配给应用程序cope到applicationscope,
您仍然可以获得上述所有优势,将来您可以轻松调查。
正如您可以在本系列的第二篇文章中看到的那样,您可以使用context(不可能)在被取消的coroutine中调用悬挂函数。我们建议您使用它来执行悬浮函数,这些功能通常用于执行悬浮函数清理资源。但是您不应滥用它。
这样做的风险很高,因为您将无法控制Coroutine的执行。实际上,它可以使代码更加简洁,更可读,但同时,它也可能在将来引起一些不可预测的问题。
例如:
尽管此方案非常诱人,但您可能并不总是知道非常重要的术()背后的逻辑。它可能是扩展库;它可能是接口背后的实现。这可能会引起各种问题:
这些问题将导致微妙且难以调试。
建议:单独使用与清洁操作有关的代码。
每当您需要执行超过当前范围范围的某些作业时,我们建议您在应用程序类中创建自定义范围并在此范围中执行Coroutines。在同一时间,应注意,执行此类任务时,避免使用GlobalsCope,ProcessLifeCycleOwner或不可融合。
原始:https://juejin.cn/post/7096248579290824735