.NET MAUI Android中如何为ListenableWorker使用ListenableFuture
在.NET MAUI中基于ListenableWorker实现规范的异步后台任务
有一个方案是直接使用.Result将异步方法转为同步执行,但我认为在.NET MAUI中使用ListenableFuture执行异步代码应该有更规范的方式。
背景
我正在开发一个周期性运行的Worker,它可能会调用async方法,例如从互联网获取数据。Android文档建议使用ListenableWorker,相关技术讨论也持相同观点。但MAUI/Xamarin的对应实现和原生Android不太一致,我无法使其正常工作。
原生Android代码示例
public class CallbackWorker extends ListenableWorker { public CallbackWorker(Context context, WorkerParameters params) { super(context, params); } @NonNull @Override public ListenableFuture<Result> startWork() { return CallbackToFutureAdapter.getFuture(completer -> { Callback callback = new Callback() { int successes = 0; @Override public void onFailure(Call call, IOException e) { completer.setException(e); } @Override public void onResponse(Call call, Response response) { successes++; if (successes == 100) { completer.set(Result.success()); } } }; for (int i = 0; i < 100; i++) { downloadAsynchronously("https://www.example.com", callback); } return callback; }); } }
我尝试的MAUI代码
public class TestTask : ListenableWorker { public TestTask(Context appContext, WorkerParameters workerParams) : base(appContext, workerParams) { } public override IListenableFuture StartWork() { return CallbackToFutureAdapter.GetFuture(new FutureCallback()); } class FutureCallback : Java.Lang.Object, CallbackToFutureAdapter.IResolver { public Java.Lang.Object? AttachCompleter(CallbackToFutureAdapter.Completer p0) { // 这里的回调该怎么处理? // 我该写些什么代码? // 我想实现类似这样的逻辑: // await DoSomethingAsync(); // 完成任务 } } }
请告诉我如何在.NET MAUI中实现文档中的示例。
补充探索
在探索API时,我发现有一个便捷的扩展方法GetAsync可以实现Android IListenableFuture到.NET Task的转换,那肯定也有我尚未知晓的反向转换方法?例如:
var existingWorks = await man.GetWorkInfosByTag(WorkerTag).GetAsync() as IEnumerable<WorkInfo>; if (existingWorks?.Any() == true) { return; }
内容的提问来源于stack exchange,提问作者Luke Vo
相关产品推荐
相关产品推荐

