从Task.Run()填充回收视图

时间:2017-11-06 20:27:00

标签: android android-fragments android-recyclerview xamarin.android litedb

我正在使用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消失,并且抽屉卡住了两个选定的项目(导航仍然有效)。

Example

另外,如果我不使用任务,而是使用新线程,我会得到所需的行为。像这样:

 Thread t = new Thread(() =>
 {
     SetData();
 });
 t.IsBackground = true;
 t.Start();

请注意,该应用行为正常,第一种方法可以正常工作 为什么?除了打开另一个线程之外,还有另一种方法来卸载数据库调用吗? (它相当昂贵的操作)

0 个答案:

没有答案