为了账号安全,请及时绑定邮箱和手机立即绑定

使用应用程序 Xamarin Android 时继续在后台执行服务

使用应用程序 Xamarin Android 时继续在后台执行服务

C#
侃侃尔雅 2021-11-28 16:06:40
当用户登录移动应用程序时,我有一些数据要插入数据库。以及我也有一些其他服务调用,这使我的应用程序登录最糟糕。所以在这里我想知道如何立即登录并在后台继续执行其他数据服务。但是我正在async打电话,这似乎不起作用。我正在进行的服务调用是否在后台运行?或者我可以让它更面糊private async Task InsertPushKeys(){           foreach (var item in SISConst.Mychildren)    {        pushInfo.OrganizationId = Convert.ToInt64(item.OrganizationID);        pushInfo.OsType = "Android";        pushInfo.ServerkeyPush = SISConst.LmgKey;        var ignore = await logDAL.InsertPushInfo(pushInfo);    }}下面一行执行服务。var ignore = await logDAL.InsertPushInfo(pushInfo);编辑 1: 我在登录按钮中按相同顺序调用这些服务_btnSignUp.Click += async (s, e) =>                    {var loggedInUser = await uLogin.UserLogin(_inputName.Text.Trim(), _inputPassword.Text);Task.Run(async () => { mychildList = await uLogin.BindMychildrenGridData(result.UserID); }).Wait(); await DeletePushKeys(loggedInUser.UserID);InsertPushKeys();                    };
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

Android 提供了 JobService 类,您可以在其中从 JobScheduler 类中调度 JobService。JobScheduler 在后台运行该服务,您可以继续登录。您可以在此处找到一个 Xamarin 示例:https : //blog.xamarin.com/replacing-services-jobs-android-oreo-8-0/


创建一个 JobService 类并在 OnStartJob 函数中添加您的 InsertPushKeys 代码。确保在新线程上启动它。


OnStartJob(JobParameters parameters){

 new Thread(new Runnable() {

       public void run() {

           await InsertPushKeys();

       }

   }).start();

}

现在使用 JobInfo 类构建作业,如上面的链接所示:


ComponentName componentName = new ComponentName(this, MyJobService.class);

JobInfo jobInfo = new JobInfo.Builder(12, componentName)

       .setRequiresCharging(true)

   .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)

   .build();

最后,您可以安排您的工作,它将由 android 执行。


JobScheduler jobScheduler = (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE);

int resultCode = jobScheduler.schedule(jobInfo);

if (resultCode == JobScheduler.RESULT_SUCCESS) {

   Console.WriteLine(TAG, "Job scheduled!");

} else {

   Console.WriteLine(TAG, "Job not scheduled");

}

确保在不同的线程上运行任务。


查看完整回答
反对 回复 2021-11-28
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

这就是你要找的。服务是 Android 框架提供的一种构造,可以完全满足您的需求。欲了解更多信息,请检查 -

http://www.vogella.com/tutorials/AndroidServices/article.html

TLDR:把你的API调用内部服务的onCreate(),并return START_STICKY从它onStartCommand()。不要忘记调用startService()服务的实例。


查看完整回答
反对 回复 2021-11-28
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

在Task.Run不使用 await 关键字的情况下在内部调用您的服务。Await 持有控制权,直到它完成完全执行。它可能会警告您使用 await 关键字,但您可以忽略它。


Task.Run(async () =>

{       

     InsertPushKeys();

});

& 不要.Wait()在方法结束时尝试使用(直到你需要它),它会阻止你的执行。


查看完整回答
反对 回复 2021-11-28
  • 3 回答
  • 0 关注
  • 575 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信