【问题标题】:Can someone provide a good Listenable worker example?有人可以提供一个好的 Listenable worker 示例吗?
【发布时间】:2019-05-06 15:47:21
【问题描述】:

我一直在研究ListenableWorker 类以使用新的工作管理器创建服务。但我在任何地方都找不到任何例子。任何描述工作经理的来源,都给出了 Worker 类的例子,它有一个很好的 doWork 方法,但它不符合我的要求。所以我希望你的帮助写一个很好的服务使用ListenableWorker 可以处理ListenableFuture

我已经尝试过 android 开发人员的文档,在他们的文档中,他们写过关于使用 guava 和使用并发期货的文章,两者都没有提供任何示例来编写简单的服务。我还观看了 workmanager 发布视频,其中 google 工程师解释了新 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 ?
    }
}

我只想返回一个未来,并想知道在我的工作完成后如何解决或拒绝那个未来。请帮助我理解它。

【问题讨论】:

  • 谷歌文档解释了一半...

标签: android android-service android-workmanager


【解决方案1】:

我也有关于如何使用 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())
    }
}

【讨论】:

  • 我看了你的例子,但我想知道你是否找到了以低于 15 分钟的间隔定期使用它的方法
  • 嗯。不是周期性的。您可能可以在您的工作完成后立即安排一份新工作(尚未测试此方法) - 但没有办法使用定期工作来做到这一点。如果您经常工作,您可以使用常规前台包含通知的服务。
  • 好一个!这是截至 2020 年 3 月互联网上唯一有意义的例子。
  • 2022 年需要一个适用于 Android 12 的新示例 :(
【解决方案2】:

你可以这样做

override fun startWork(): ListenableFuture<ListenableWorker.Result> {
    // Do your work here

    return CallbackToFutureAdapter.getFuture {
      it.set(Result.success())
    } 
}

【讨论】:

【解决方案3】:

【讨论】:

  • 好的,这可能不是我想要的响应,但它确实帮助我编写了我的代码。但我想更多地了解如何创建一个可听的未来,就像他们在带有线程池等的番石榴中所做的那样。你能也链接一些那个例子吗?谢谢
猜你喜欢
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2021-11-10
  • 2010-10-01
  • 2011-04-03
  • 2017-09-29
相关资源
最近更新 更多