You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:42:41