c# - 使用应用程序 Xamarin Android 时在后台继续执行服务
问题描述
当用户登录移动应用程序时,我有一些数据要插入数据库。除了我还有其他一些服务调用之外,这使我的应用程序登录变得最糟糕。所以在这里我想知道如何立即登录并在后台继续执行其他数据服务。
但是我正在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();
};
解决方案
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");
}
确保在不同的线程上运行任务。
推荐阅读
- office-js - 安装期间具有可配置选项的 Office 加载项?
- c# - 如何移动到最后一个表单域以结束表单流并开始新的意图
- php - 我想在“mysqli_error”之后向数据库添加记录
- python - 为什么 TF-IDF 计算要花这么多时间?
- php - 使用 PHP 从 HTML 表单中获取“n”个单选选项的有效方法
- c++ - 如何在 C++ 中计算并显示 5 个数字的平均值?
- c# - 如何阻止 Visual Studio 用内在对应物替换 C# BCL 类型
- java - weblogic启动期间的LinkageError
- swift - 到目前为止,枚举似乎没用。你能举个例子说明为什么他们不是吗?
- javascript - JSX props 不使用内联箭头函数的解决方案?