有人可以提供一个很好的可倾听的工人榜样吗?

时间:2019-05-06 15:47:22

标签: android android-service android-workmanager

我一直在研究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 ?
    }
}

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

3 个答案:

答案 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); } WorkerCoroutineWorker均为RxWorker。这是到源的链接:

https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/work/workmanager/src/main/java/androidx/work/Worker.java

https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/work/workmanager-ktx/src/main/java/androidx/work/CoroutineWorker.kt#37

答案 2 :(得分:0)

你可以这样做

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

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