我有一个谷歌地图(MapFragment),上面有超过5个标记。我想每10-15秒更新一次标记的位置。我将通过API调用获得新的坐标。
有没有办法在不阻止用户界面的情况下更新标记?用于长轮询的示例C#片段将非常棒..
我尝试过 -
RunOnUiThread(() =>
{
while(true){
//UPDATE MARKERS HERE
Thread.Sleep(5000);
}
}
但它冻结了UI。有没有办法在不冻结UI的情况下更新标记?
答案 0 :(得分:1)
这样做的:
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);
}
}