android - 有人可以提供一个好的 Listenable worker 示例吗?
问题描述
我一直在研究ListenableWorker
类以使用新的工作管理器创建服务。但我在任何地方都找不到任何例子。任何描述工作管理器的来源,都给出了Worker
类的例子,它有一个很好的doWork
方法,但它不符合我的要求。所以我希望你的帮助来编写一个很好的服务,使用ListenableWorker
它可以处理ListenableFuture
我已经尝试过 android 开发人员的文档,在他们的文档中,他们写过关于使用 guava 和使用并发期货的文章,这两者都没有提供任何示例来编写简单的服务。我还观看了 workmanager 发布视频,其中谷歌工程师解释了新的 API,但他们的示例都在 Kotlin 中,我没有使用这些类。
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.work.ListenableWorker;
import androidx.work.WorkerParameters;
import com.google.common.util.concurrent.ListenableFuture;
public class DistanceWorker extends ListenableWorker {
public DistanceWorker(Context context, WorkerParameters workerParameters){
super(context, workerParameters);
}
@NonNull
@Override
public ListenableFuture<Result> startWork() {
//what to write here ?
}
}
我只想返回一个未来,并想知道当我的工作完成后如何解决或拒绝那个未来。请帮助我理解它。
解决方案
我也有关于如何使用 Kotlin 使用 ListenableWorkers 的问题。所以我建立了这个小例子来检索位置,我相信这是使用它的最常见的情况。
https://github.com/febaisi/ListenableWorkerExample
这是一个通用的基本用法(未测试) - 我相信检查我的项目更容易,我在其中添加了完整的测试版本。我从 Github 项目的 worker 中获取数据,在这里很难举例说明。
//Enqueue work
val anyWorkListenableWorker = OneTimeWorkRequest.Builder(AnyWorkListenableWorker::class.java).build()
workManagerInstance.enqueueUniqueWork("ANY_WORK", ExistingWorkPolicy.KEEP, anyWorkListenableWorker)
class AnyWorkListenableWorker(appContext: Context, workerParams: WorkerParameters)
: ListenableWorker(appContext, workerParams) {
private val future : ResolvableFuture<Result> = ResolvableFuture.create()
override fun startWork(): ListenableFuture<Result> {
//MAIN THREAD
CoroutineScope(Default).launch {
//Launch scope to do work out of the main thread
doAnyWork()
}
return future
}
private fun doAnyWork() {
//Do long work
future.set(Result.success())
}
}
推荐阅读
- windows-10 - Active Reports 6 PdfExport.Export() 方法在 Windows 10 创意者更新后引发 ArgumentOutOfRangeException
- c# - 在 .net Core、C# 中并行调用 API 的最佳方法是什么?
- php - 将查询的值与 php 中的 for 循环的值进行比较
- winforms - 如何更改datagridview中单个单元格的高度?
- bash - Bash:如果语句没有看到文件名被循环抓取
- excel - 如何使用python pandas在excel文档中的行和列中删除没有浮动的行
- embedded - Rtems 5 BSP 测试失败
- c - Winsock:服务器上的 recv() 被阻塞,但客户端已经移过 send()
- jboss - JEE 服务器中是否有内部进程来杀死/释放丢失的会话?
- node.js - 如何让 HAML 布局与 haml-coffee 和 Express 4 一起使用?