我一直在try 使用Xamarin在.NET中实现WorkManager(https://developer.android.com/topic/libraries/architecture/workmanager/)(将旧代码移植到我们使用JobScheduler的地方).在启动应用程序时,我收到"错误:无法激活类型为MyWorker1的JNI句柄",并且似乎找不到为什么我的实现被 destruct 了.
我的基本实现:
using Android.App;
using Android.Content;
using AndroidX.Work;
using System;
using MyTooling.Services;
using MyTooling.ViewModels.Base;
namespace MyTooling.Droid.Workers
{
public abstract class BackgroundWorkerBase : Worker
{
protected MyService1 MyService;
protected WorkerParameters WorkerParameters { get; }
protected BackgroundWorkerBase(Context context, WorkerParameters workerParameters) : base(context, workerParameters)
{
if (!Xamarin.Forms.Forms.IsInitialized)
Xamarin.Forms.Forms.Init(Application.Context, null);
if (!ViewModelLocator.IsRegistered)
ViewModelLocator.RegisterDependencies(Helpers.Settings.UseMocks);
MyService = ViewModelLocator.Resolve<MyService1>();
WorkerParameters = workerParameters;
}
public override Result DoWork()
{
try
{
var success = TryBackgroundWork();
if (!success || AnyWorkLeft())
return Result.InvokeRetry();
else
return Result.InvokeSuccess();
}
catch (Exception ex)
{
Log.LogError(ex);
return Result.InvokeFailure();
}
}
protected abstract bool AnyWorkLeft();
protected abstract bool TryBackgroundWork();
}
}
JNI错误所指的类:
using Android.Content;
using AndroidX.Work;
namespace MyTooling.Droid.Workers
{
public class MyWorker1: BackgroundWorkerBase
{
public MyWorker1(Context context, WorkerParameters workerParameters) : base(context, workerParameters)
{
}
protected override bool AnyWorkLeft()
{
return MyService.AnyWork1Left();
}
protected override bool TryBackgroundWork()
{
return MyService.TryDoWork1();
}
}
}