【问题标题】:Xamarin Forms with WorkManger带有 WorkManger 的 Xamarin 表单
【发布时间】:2020-10-16 10:02:33
【问题描述】:

我正在尝试在 nuget 包 Xamarin.Android.Arch.Work.Runtime 中使用 WorkManager 的 Xamarin 实现。

问题是:如何将“复杂”的参数传递给worker类?

我有一个带有 DI 和其他类的 Xamarin Forms 应用程序,但该作业只收到 Java.Lang.Object

我的代码:

// Method to Schedule the Job
// See the dataParam? That line throw an exception
// I can manage to pass a simple string or int to the job this way, but not 
// complex classes
public void ScheduleAppJobs(IContainerProvider containerRegistry)
{
       //here the code throw an exception
       var dataParam = new Data.Builder().Put("param", new JobParameter());
        
       var syncWorkerReuest = PeriodicWorkRequest.Builder.From<SyncChecklistWorker>(TimeSpan.FromMinutes(5))
                                                                      .SetInputData(dataParam.Build())
                                                                      .Build(); 
       WorkManager.Instance.Enqueue(syncWorkerReuest);
    }

    //this was my try to create a custom class and populate with my objects
    //But didn't worked
    public class JobParameter : Java.Lang.Object
    {
    }

    //my job implementation
    public class SyncChecklistWorker : Worker
        {
            public SyncChecklistWorker(Context context, WorkerParameters workerParameters) : base(context, workerParameters)
            {
            }
    
            public override Result DoWork()
            {
                if (InputData.KeyValueMap.TryGetValue("param", out Java.Lang.Object @object))
                {
                    var jobParam = (JobParameter)@object;
    
                    // here I would like to get my DI container to resolve services and execute business logic
                    // var diResolver = jobParam.GetDIContainer();
    
                    return Result.InvokeSuccess();
                }
    
                return Result.InvokeRetry();
            }
        }
}

问题是:

  • 将输入数据传递给作业的唯一方法是 Data.Builder 只接受 Java.Lang.Object。甚至尝试使用 JobParameter : Java.Lang.Object 我在尝试执行时收到以下错误:new Data.Builder().Put("param", new JobParameter()); 错误:Java.Lang.IllegalArgumentException: 'Key param has invalid type class crc648d221dddf00bc7fb.JobParameter'
  • 在官方 Microsoft Docs 中,FireBase Job Dispatcher nuget 已弃用。那么如何使用新的 WorkManager 呢?

FireBase 作业调度程序文档: https://docs.microsoft.com/en-us/xamarin/android/platform/firebase-job-dispatcher

已弃用的 nuget: https://www.nuget.org/packages/Xamarin.Firebase.JobDispatcher

知道如何解决这个问题吗?

【问题讨论】:

    标签: xamarin xamarin.forms xamarin.android android-workmanager


    【解决方案1】:

    来自数据构建器的工作请求仅接受前置类型。您可以通过序列化为 JSON 字符串格式来传递对象,并在 DoWork() 中反序列化它。

     public void ScheduleAppJobs(IContainerProvider containerRegistry)
     {
        var dataParam = new Data.Builder().PutString("param",serializeToJson(new  
        MyClass())); 
    
        var syncWorkerReuest = PeriodicWorkRequest.Builder.From<SyncChecklistWorker> 
        (TimeSpan.FromMinutes(5))                                                                  
        .SetInputData(dataParam.Build())
        .Build();  
         WorkManager.Instance.Enqueue(syncWorkerReuest);
       }
    
       public override Result DoWork()
       {
         var jsonString = InputData.GetString("param");
         var myClassObj = deserializeFromJson(jsonString );
        }
     
        using Newtonsoft.Json;
        public  string serializeToJson(MyClass myClassObj)
         {
            var resultString = JsonConvert.SerializeObject(myClassObj);
            return resultString;
         }
    
          // Deserialize to single object.
          public  MyClass deserializeFromJson(string jsonString)
          {
            var serializer = new JsonSerializer();
            var resultObject = serializer.Deserialize<MyClass>(jsonString);
          }
    

    【讨论】:

    • 对,我注意到关于原语参数。我在这个链接上明白了为什么:medium.com/androiddevelopers/…。甚至认为我认为 Xamarin 家伙应该更容易使用这种方法与 DI 注入器......在这种情况下,序列化不是一个选项,因为 DI 容器是在 App.xaml 类上实例化的,我需要它的实例引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多