0

Hy, 내 Xamarin.Android 앱에서 RecyclerView로 SQLite.net 쿼리를 다시 표시하려고합니다. 쿼리를 excecuting 할 때마다 모든 것이 잘 동작합니다. 하지만 내가 비동기로 excecute, Recyclerview가 나타나지 않습니다. 쿼리의 결과를 확인하고 예상되는 모든 항목이 들어 있습니다.ToListAsync() 후 RecyclerView 표시

songsEntryArray = MusicShareDatabase.Instance.Database.Table<SongsEntry>().ToArray(); 

mRecyclerView = rootView.FindViewById<RecyclerView>(Resource.Id.allsongs_recyclerview); 
mLayoutManager = new LinearLayoutManager(this.Activity); 
mRecyclerView.SetLayoutManager(mLayoutManager); 
mAdapter = new AllSongsAdapter(songsEntryArray); 
mAdapter.ItemClick += OnItemClick; 
mRecyclerView.SetAdapter(mAdapter); 
mAdapter.NotifyDataSetChanged(); 

을 그리고이 작동하지 않습니다 : 이 작동

var query = MusicShareDatabase.Instance.DatabaseAsync.Table<SongsEntry>(); 

query.ToListAsync().ContinueWith(t => 
{ 
    mRecyclerView = rootView.FindViewById<RecyclerView>(Resource.Id.allsongs_recyclerview); 
    mLayoutManager = new LinearLayoutManager(this.Activity); 
    mRecyclerView.SetLayoutManager(mLayoutManager); 
    mAdapter = new AllSongsAdapter(t.Result.ToArray()); 
    mAdapter.ItemClick += OnItemClick; 
    mRecyclerView.SetAdapter(mAdapter); 
    mAdapter.NotifyDataSetChanged(); 
}); 

답변

1

내가 ContinueWith(Action action)는 백그라운드 스레드에서 실행되고 있다고 생각합니다.

Activity.RunOnUiThread(Action action);으로 UIThread에서이 코드를 실행해야합니다.

코드

query.ToListAsync().ContinueWith(t => 
{ 
    Activity.RunOnUiThread(() => { 
     mRecyclerView = rootView.FindViewById<RecyclerView>(Resource.Id.allsongs_recyclerview); 
     mLayoutManager = new LinearLayoutManager(this.Activity); 
     mRecyclerView.SetLayoutManager(mLayoutManager); 
     mAdapter = new AllSongsAdapter(t.Result.ToArray()); 
     mAdapter.ItemClick += OnItemClick; 
     mRecyclerView.SetAdapter(mAdapter); 
     mAdapter.NotifyDataSetChanged(); 
    }); 
});