我正在使用Xamarin Android,在我的应用程序中,我有一个从LiteDB填充的回收视图。
现在,在OnCreateView
中,在我的包含循环视图的片段中,我设置了适配器,并调用SetData()
来填充我的列表。
看起来像这样:
mLayoutManager = new LinearLayoutManager(Context);
mRecyclerView.SetLayoutManager(mLayoutManager);
mAdapter = new PlaylistItemAdapter(new List<YoutubePlaylistSync>());
mRecyclerView.SetAdapter(mAdapter);
SetData();
这很好用,但是当我查看片段时,应用会冻结。这是正常的,因为从数据库中获取数据的调用是阻塞的。
我想从UI线程卸载工作,所以因为我需要解雇并忘记这个函数,所以我用以下代码替换了代码:
Task.Run(() => SetData());
这没有按照我的预期发挥作用,我确认调用了该函数并且该函数设置了新数据,并调用了NotifyNewData()
。
private void SetData()
{
mAdapter.SetData(db.GetData());
}
//In PlaylistItemAdapter
public void SetData(IEnumerable<YoutubePlaylistSync> newData)
{
playlists.Clear();
foreach (var playlist in newData)
{
playlists.Add(playlist);
}
NotifyDataSetChanged();
}
但是列表没有填充,如果我转到另一个选项卡并返回,我的布局中的FAB消失,并且抽屉卡住了两个选定的项目(导航仍然有效)。
另外,如果我不使用任务,而是使用新线程,我会得到所需的行为。像这样:
Thread t = new Thread(() =>
{
SetData();
});
t.IsBackground = true;
t.Start();
请注意,该应用行为正常,第一种方法可以正常工作 为什么?除了打开另一个线程之外,还有另一种方法来卸载数据库调用吗? (它相当昂贵的操作)