我有一个问题。
我创建了一个带有一些按钮和 GridView 的 Android 页面。现在 GridView 填充了来 self 网站的 json,我想每 3 秒重新加载 GridView,不会减慢应用程序!所以我尝试了这个:
在Page1加载void:
RunOnUiThread(() => LoadOrdersAsync());
函数:
public async Task LoadOrdersAsync()
{
while (true)
{
//Creating SortedList
if (OrderListAdapter == null)
{
//Fill the DataSource of the ListView with the Array of Names
OrderListAdapter = new OrderListAdapter(this, SortedOrderList);
GridviewOrders.Adapter = OrderListAdapter;
}
else
{
OrderListAdapter.refresh(SortedOrderList);
}
// don't run again for at least 3 seconds
await Task.Delay(3000);
}
}
问题是所有内容都已填满,但由于该线程,UI 滞后。我该如何解决这个问题?
最佳答案
您无法在不中断 ui 的情况下刷新 GridView ,因为刷新 GridView 必须在 ui 线程上完成。
如果应用程序延迟,那么您希望一次用太多数据填充 GridView ,因此渲染所有行需要时间。
您的解决方案是准备一些分页机制,我的意思是,仅加载可见的数据量+少量数据,当用户尝试向下滚动并且他试图滚动超过可用行时,然后将另一行添加到您的gridview 并在用户向下滚动时一遍又一遍地执行此操作。
我过去遇到过常见问题,我正在编写 xamarin 表单应用程序,并且我有一个包含 100 000 条记录的列表。如果你一次加载所有内容,你会挂起几秒钟,所以我想出了分页,并在需要时填充更多,这真的很好。
您可以添加一些繁忙指示器来衡量用户体验。
编辑1:
首先,正如其他人已经提到的,您只需要使用 ui 线程来更新控件中的数据。我已经提到了分页机制(但您没有说出您期望的行数),但首先检查下面的代码,如果您仍然遇到问题,那么您需要进行分页。您可以尝试仅使用 20 个元素更新您的列表,以测试是否有帮助。
//page1 load
private void Load()
{
LoadOrdersAsync();
}
private async Task LoadOrdersAsync()
{
while (true)
{
//Creating SortedList
var SortedOrderList = //add your logic
RunOnUiThread( ()=>
{
if (OrderListAdapter == null)
{
//Fill the DataSource of the ListView with the Array of Names
OrderListAdapter = new OrderListAdapter(this, SortedOrderList);
GridviewOrders.Adapter = OrderListAdapter;
}
else
{
OrderListAdapter.refresh(SortedOrderList);
}
});
// don't run again for at least 3 seconds
await Task.Delay(3000);
}
}
关于c# - 每 3 秒重新加载 GridView,而不中断 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53960731/