0

我正在使用 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 调用吗?(这是一个相当昂贵的操作)

4

0 回答 0