如何在不中断用户体验的情况下在后台轮询 webapi 请求?
How to poll webapi request in the background without interrupting user experience?
目前我有一个应用程序允许用户将数据发送到 restful webapi,同时连接到互联网,但这个应用程序也应该离线工作。因此,我将用户操作存储在 SQLlite 数据库中。当移动设备找到互联网连接时,此信息应保存到 webapi。
我已经实施
public bool IsConnected(){
var connectivityManager = (ConnectivityManager)GetSystemService (ConnectivityService);
var activeConnection = connectivityManager.ActiveNetworkInfo;
if ((activeConnection != null) && activeConnection.IsConnected) {
return true;
}
return false;
}
这由每个 activity 的 OnCreateOptionMenu() 调用。哪个工作正常。但是,当我发出 webapi 请求时,遗憾的是同步调用会导致应用程序显示空白屏幕,直到它处理完为止。现在这是我想要替换的用户体验,类似于 ASYNC(异步)请求,它可以在后台无中断地运行所有内容。但我正在努力实施这一点。我在应用程序主屏幕上确实有一个同步按钮,它 onclick 运行 异步调用但是我不相信应用程序用户会按下这个按钮。因此,我想在后台触发这项工作。有人可以请教吗?
谢谢@MilenPavlov 和@CDrosos。
我选择了 CDrosos 的解决方案,因为这正是我一直在寻找的理想解决方案。
我在 BaseActivity 中创建了一个静态计时器成员,它在应用程序启动时设置。这样就不会发生并发。这使我能够创建一个计时器经过的方法,该方法将检查数据库中是否有未决的 Web 请求,如果 IsConnected 和 pendingWebRequests.Any().
,则为 post
if (_timer == null)
{
_timer = new Timer();
_timer.Elapsed += _timer_Elapsed;
_timer.Interval = (1000 * 60) * 5; // 5 ;
_timer.Start();
}
然后进行webapi请求。
目前我有一个应用程序允许用户将数据发送到 restful webapi,同时连接到互联网,但这个应用程序也应该离线工作。因此,我将用户操作存储在 SQLlite 数据库中。当移动设备找到互联网连接时,此信息应保存到 webapi。 我已经实施
public bool IsConnected(){
var connectivityManager = (ConnectivityManager)GetSystemService (ConnectivityService);
var activeConnection = connectivityManager.ActiveNetworkInfo;
if ((activeConnection != null) && activeConnection.IsConnected) {
return true;
}
return false;
}
这由每个 activity 的 OnCreateOptionMenu() 调用。哪个工作正常。但是,当我发出 webapi 请求时,遗憾的是同步调用会导致应用程序显示空白屏幕,直到它处理完为止。现在这是我想要替换的用户体验,类似于 ASYNC(异步)请求,它可以在后台无中断地运行所有内容。但我正在努力实施这一点。我在应用程序主屏幕上确实有一个同步按钮,它 onclick 运行 异步调用但是我不相信应用程序用户会按下这个按钮。因此,我想在后台触发这项工作。有人可以请教吗?
谢谢@MilenPavlov 和@CDrosos。
我选择了 CDrosos 的解决方案,因为这正是我一直在寻找的理想解决方案。
我在 BaseActivity 中创建了一个静态计时器成员,它在应用程序启动时设置。这样就不会发生并发。这使我能够创建一个计时器经过的方法,该方法将检查数据库中是否有未决的 Web 请求,如果 IsConnected 和 pendingWebRequests.Any().
,则为 post if (_timer == null)
{
_timer = new Timer();
_timer.Elapsed += _timer_Elapsed;
_timer.Interval = (1000 * 60) * 5; // 5 ;
_timer.Start();
}
然后进行webapi请求。