我正在使用 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();
请注意,该应用程序行为正常,第一种方法可以正常工作。
为什么?除了打开另一个线程之外,还有其他方法可以卸载 DB 调用吗?(这是一个相当昂贵的操作)