c# - 每 3 秒重新加载 GridView,而不中断 UI

标签 c# xamarin asynchronous task

我有一个问题。

我创建了一个带有一些按钮和 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/

相关文章:

android - 错误 : Only the original thread that created a view hierarchy can touch its views in Xamarin

node.js - 通过 Node 请求包递归使用 async/await

用于显式添加微任务或宏任务的 Javascript API

c# - 在不更新 UI 元素的代码中定义的 WPF 数据绑定(bind)问题

c# - 使用 NetTopologySuite 计算点之间的地理距离

sockets - 如何使套接字在xamarin中工作?

scala - RxScala Observables 与 Play Framework 枚举器

c# - SQL Server CE 中的正确日期时间格式?

c# - 反序列化 JSON 颜色十六进制,不带引号

c# - iOS TableView 按钮被多次调用