Android 如何通知Workmanager任务已完成以进行服务?

Android 如何通知Workmanager任务已完成以进行服务?,android,android-service,android-workmanager,Android,Android Service,Android Workmanager,我的工作者(用于API调用)从服务开始,我想将完成事件发送到服务类。 最好的方法应该是什么 从服务呼叫: PeriodicWorkRequest request = new PeriodicWorkRequest .Builder(Worker.class, Constants.REPEAT_INTERVAL, TimeUnit.MINUTES) .addTag(TAG) .setConstraint

我的工作者(用于API调用)从服务开始,我想将完成事件发送到服务类。 最好的方法应该是什么

从服务呼叫:

PeriodicWorkRequest request = new PeriodicWorkRequest
                .Builder(Worker.class, Constants.REPEAT_INTERVAL, TimeUnit.MINUTES)
                .addTag(TAG)
                .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
                .build();
        WorkManager.getInstance(getApplicationContext()).enqueue(request);
    
override fun doWork(): Result {
    // API call
    return Result.success()
}
从工作经理处呼叫:

PeriodicWorkRequest request = new PeriodicWorkRequest
                .Builder(Worker.class, Constants.REPEAT_INTERVAL, TimeUnit.MINUTES)
                .addTag(TAG)
                .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
                .build();
        WorkManager.getInstance(getApplicationContext()).enqueue(request);
    
override fun doWork(): Result {
    // API call
    return Result.success()
}

好的,我要做的是为Worker和Service类创建公共对象,并利用Observer模式。此
WorkObserver
对象将充当服务和工作程序之间的代理。以Koin为例,它看起来是这样的:

类MyWorker:Worker(),KoinComponent{
private val workObserver:workObserver by inject()
重写fun doWork():结果{
val result=api.call().execute()
如果(结果:isSuccessful){
workObserver.notifySuccess()
返回Result.success()
}否则{
workObserver.notifyError()
返回Result.failure()
}
}
}
类MyService:Service(),KoinComponent{
private val workObserver:workObserver by inject()
重写fun onCreate(){
workObserver.setOnResultListener{result->
如果(结果){
//做点什么
}否则{
//做点别的
}
}
重写onDestroy(){
workObserver.setOnResultListener(空)
}
}
类观察服务器{
私有变量onResultListener:((结果)->单位)?=null
fun setOnResultListener(监听器:((结果)->单位)?){
this.onResultListener=侦听器
}
成功的乐趣{
此.onResultListener?.invoke(true)
}
错误(){
this.onResultListener?.invoke(false)
}
}
当然,您可以使用其他DI工具来实现这一点,您可以有一个侦听器列表并删除特定的侦听器,您可以使用所需的负载通过WorkObserver中的侦听器传递任何其他对象

但是,对于这种简单的情况,如果您不想使用DI,简单对象将完成这项工作。但是,当您的代码库增长,并且您正在处理多线程问题,或者甚至在应用程序的其他部分访问此对象时,可能会导致问题。我使用它只是为了在对象之间传递信息,我不建议在r存储数据等:

class MyWorker:Worker(){
重写fun doWork():结果{
val result=api.call().execute()
如果(结果:isSuccessful){
WorkObserver.notifySuccess()
返回Result.success()
}否则{
WorkObserver.notifyError()
返回Result.failure()
}
}
}
类MyService:Service(){
重写fun onCreate(){
WorkObserver.setOnResultListener{result->
如果(结果){
//做点什么
}否则{
//做点别的
}
}
重写onDestroy(){
WorkObserver.setOnResultListener(空)
}
}
对象观察服务器{
私有变量onResultListener:((结果)->单位)?=null
fun setOnResultListener(监听器:((结果)->单位)?){
this.onResultListener=侦听器
}
成功的乐趣{
此.onResultListener?.invoke(true)
}
错误(){
this.onResultListener?.invoke(false)
}
}

例如,您是否使用协同程序?否@MariuszBronaCan您描述了对象之间的连接吗?@MariuszBrona,请查看更新的问题。您有没有其他没有DI的解决方案?嘿,现在检查一下