我正在尝试使用领域以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>();
}
更改会导致另一个问题。重复执行以下步骤导致应用程序崩溃
这会导致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
触发项目点击命令的代码是
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