更新 Google 使用无阻塞长轮询的地图标记 UI
Update Google Maps marker with long polling without blocking UI
我有一个 Google 地图 (MapFragment),上面有 5 个以上的标记。我想每 10-15 秒更新一次标记的位置。我将通过 API 电话获得新坐标。
有什么方法可以在不阻塞 UI 的情况下更新标记?用于长轮询的示例 C# 片段会很棒..
我试过 -
RunOnUiThread(() =>
{
while(true){
//UPDATE MARKERS HERE
Thread.Sleep(5000);
}
}
但它冻结了 UI。有什么方法可以在不冻结的情况下更新标记 UI?
正在做:
RunOnUiThread(() =>
{
while(true){
//UPDATE MARKERS HERE
Thread.Sleep(5000);
}
}
强制匿名方法内的所有内容到 UI 线程上的 运行。所以包含 Thread.Sleep
的 while 循环阻塞了 UI.
相反,您想异步执行长操作,例如在 C# 中使用 TPL (async/await)。
Dictionary<int, Marker> _markers = new Dictionary<int, Marker>();
async Task PollServerAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
var coordinates = await GetNewCoordinatesFromServerAsync(cancellationToken);
foreach (var coord in coordinates)
{
var marker = _markers[_coord.Id];
RunOnUiThread(() =>
{
marker.SetPosition(coord.Position);
});
}
await Task.Delay(5000, cancellationToken);
}
}
我有一个 Google 地图 (MapFragment),上面有 5 个以上的标记。我想每 10-15 秒更新一次标记的位置。我将通过 API 电话获得新坐标。
有什么方法可以在不阻塞 UI 的情况下更新标记?用于长轮询的示例 C# 片段会很棒..
我试过 -
RunOnUiThread(() =>
{
while(true){
//UPDATE MARKERS HERE
Thread.Sleep(5000);
}
}
但它冻结了 UI。有什么方法可以在不冻结的情况下更新标记 UI?
正在做:
RunOnUiThread(() =>
{
while(true){
//UPDATE MARKERS HERE
Thread.Sleep(5000);
}
}
强制匿名方法内的所有内容到 UI 线程上的 运行。所以包含 Thread.Sleep
的 while 循环阻塞了 UI.
相反,您想异步执行长操作,例如在 C# 中使用 TPL (async/await)。
Dictionary<int, Marker> _markers = new Dictionary<int, Marker>();
async Task PollServerAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
var coordinates = await GetNewCoordinatesFromServerAsync(cancellationToken);
foreach (var coord in coordinates)
{
var marker = _markers[_coord.Id];
RunOnUiThread(() =>
{
marker.SetPosition(coord.Position);
});
}
await Task.Delay(5000, cancellationToken);
}
}