我一直在研究ListenableWorker
类,以使用新的工作经理创建服务。但我无处发现任何例子。任何描述工作管理器的资料都提供了Worker
类的示例,该类具有不错的doWork
方法,但不满足我的要求。因此,我希望您的帮助使用ListenableWorker
编写可以处理ListenableFuture
的不错的服务
我尝试过android开发人员的文档,在他们的文档中,他们写过关于使用guava和使用并发功能的书,但这两个都没有提供任何示例来编写简单的服务。我还观看了工作经理发布的视频,其中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 ?
}
}
我只想返回一个未来,并想知道在完成工作后如何解决或拒绝那个未来。请帮助我理解它。
答案 0 :(得分:2)
我还对如何通过Kotlin使用ListenableWorkers产生了疑问。因此,我建立了这个小例子来检索位置,我相信这是最常见的使用情况。
https://github.com/febaisi/ListenableWorkerExample
这是一个通用的基本用法(未经测试)-我认为将项目添加到完整的测试版本中可以更容易地检查我的项目。 我从Github项目的工作人员那里得到数据,在这里很难举例说明。
//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())
}
}
答案 1 :(得分:0)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int calculate(const char* expr, float *result);
int calculate_rec(const char* expr, float *result, int i, char sg, int number);
int main(void){
char expression[201]={0};
char *expr=expression;
float result;
float *res=&result;
printf("enter operation: ");
fgets(expr, 201, stdin);
fflush(stdin);
calculate(expr, res);
printf("%.2f", result);
return 0;
}
int calculate(const char* expr, float *result){
if(expr==NULL) return 0;
calculate_rec(expr, result, 0, 0, 0);
return 1;
}
int calculate_rec(const char* expr, float *result, int i, char sg, int number){
if(isdigit(*(expr+i))) number=number*10+*(expr+i)-'0';
else{
switch(sg){
case '+': *result += number;
break;
case '-': *result -= number;
break;
case '*': *result *= number;
break;
case '/': if(number==0) return 0;
*result /= number;
break;
}
number = 0;
sg = *(expr + i);
}
if (*(expr + i)=='\0') return 1;
return calculate_rec(expr, result, i + 1, sg, number);
}
,Worker
或CoroutineWorker
均为RxWorker
。这是到源的链接:
答案 2 :(得分:0)
你可以这样做
override fun startWork(): ListenableFuture<ListenableWorker.Result> {
// Do your work here
return CallbackToFutureAdapter.getFuture {
it.set(Result.success())
}
}