UI从领域加载大量数据时卡住了

时间:2018-04-14 15:49:40

标签: xamarin xamarin.forms realm

我正在尝试使用领域以xamarin形式在listview上显示10,000个联系人。但每当用户遍历联系人列表屏幕时 它会在一段时间后冻结并加载。

此外,我还提供了一个从列表中搜索的选项,如果在UI线程上执行,它也会被卡在搜索中。

以下是从领域加载数据的代码

public override async Task Initialize(Object data )
    {

             private Realm _realmInstance = getRealm();
            if (contactList != null)
            {
                contactList.Clear();
            }


            contactList = _realmInstance.All<Contact>().OrderByDescending(d => d.contactId).ToList(); 
            // here the binding happens with realm data
            contacts = new ObservableCollectionFast<Contact>(contactList);
    }

 public ObservableCollectionFast<Contact> contacts
        {
            get { return items; }
            set
            {
                items = value;

                OnPropertyChanged("contacts");
            }


        }

因为它在加载时需要时间我想在后台获取领域数据并将其绑定在UI线程上,如下所示 但这就是抛出错误

  

从不正确的线程访问的领域

  await Task.Run(() => {

                contactList = _realmInstance.All<Contact>().OrderByDescending(d => d.contactId).ToList();

            });

            if (contactList.Count() > 0)
            {
                ContactListView = true;
                AddContactMsg = false;
            }
            else
            {
                AddContactMsg = true;
            }


            Device.BeginInvokeOnMainThread(() =>
            {

                contacts = new ObservableCollectionFast<Contact>(contactList);

            });

我想尝试使用TAKE的{​​{1}}函数来限制结果,但不幸的是它还没有得到领域的支持。我不确定如何顺利地将记录从领域加载到listview。

修改

根据SushiHangover,我已将内容从LINQ更改为IList

IQueryable

到目前为止,搜索工作非常顺利,但public IQueryable<Contact> contacts { get { return items; } set { items = value; OnPropertyChanged("contacts"); } } public override async Task Initialize(Object data ) { _realmInstance = getRealm(); contacts = dbContactList= _realmInstance.All<Contact>(); } 更改会导致另一个问题。重复执行以下步骤导致应用程序崩溃

  1. 点击列表项
  2. 详细信息页面打开然后按下
  3. 向下滚动到几条记录
  4. 执行步骤1并重复
  5. 这会导致stackoverflow错误

      

    04-19 06:05:13.980 F / art(3943):art / runtime / runtime.cc:289]   待定异常由void引发的java.lang.StackOverflowError异常   md5b60ffeb829f638581ab2bb9b1a7f4f3f.CellAdapter.n_onItemClick(android.widget.AdapterView,   android.view.View,int,long): - 2'04-19 06:05:13.980 F / art(   3943):art / runtime / runtime.cc:289] java.lang.StackOverflowError:stack   大小8MB

    Link to entire log file

    触发项目点击命令的代码是

    IQueryable

    以下代码将打开一个详细信息页面

    public ICommand OnContactSelectCommand => new Command<Contact>(OnContactSelect);
    

    注意:

    当我用private async void OnContactSelect(Contact contact) { if (contact != null) { await NavigationService.NavigateToAsync<ContactDetailViewModel>(contact.mContactId); } } 替换IQueryable时,我没有遇到任何错误

    某种程度上,我的问题与realm github thread有关,其中用户在List使用listView.SelectedItem = null时获得了例外

    这是我的列表视图项目代码点击

    IQueryable

0 个答案:

没有答案