Это проблема с потоком. Вам необходимо знать, что все представления, созданные в вашем пользовательском интерфейсе, создаются в MainThread, который также называется UIThread.
Теперь это общая концепция. что если у вас есть представление, только поток, который его создает, может его изменить, т. е. UIThread теперь возникает вопрос, как вы это сделаете, когда выполняющийся код находится в фоновом или вторичном потоке, независимо от того, кто его создал? Таким образом, используемая вами платформа обычно дает вам такой путь.
Например, Android,
Android имеет метод в своем классе Activity
, который теперь называется RunOnUiThread
это метод, который вы используете, когда есть что-то, что нужно сделать в пользовательском интерфейсе, но вы находитесь в фоновом потоке. iOS также имеет метод, который называется InvokeOnMainThread
, XF имеет BeginInvokeOnMainThread
!
Теперь, для вашей ситуации, вы добавляете фоновую задачу, которая лениво загружает ваш View, что здорово, теперь вам нужно понимать, что это не в главном потоке, так как вы создали задачу, которая должна выполняться в другом потоке через Task.Run
, поэтому теперь вы используете метод Trick, о котором мы говорили, где бы вы ни играли с Views:
Обратите внимание, что я могу что-то упустить, потому что я не знаю весь код, но вы можете сделать все остальное самостоятельно, если вы освоите основы, поэтому здесь ничего не говорится:
protected override async void OnCreate(Bundle savedInstanceState)
{
.....
.....
loadingSpinner.Visibility = ViewStates.Visible;
await Task.Run(() =>
{
//get all the speakers from the db
allSpeakers = DatabaseHelper.GetAllFromTable<Speaker>("speakers.db");
//get only the international spakers
internationalSpeakers = allSpeakers.Where(x => x.Nationality.Equals("international")).ToList();
//get only the national speakers
nationalSpeakers = allSpeakers.Where(x => x.Nationality.Equals("national")).ToList();
RunOnUiThread(()=>
{
//fill in the RecyclerView with data
speakersRecyclerView = FindViewById<RecyclerView>(Resource.Id.speakersRecyclerView);
speakersLayoutManager = new LinearLayoutManager(this);
speakersRecyclerView.SetLayoutManager(speakersLayoutManager);
speakersAdapter = new SpeakersAdapter(speakers);
speakersAdapter.ItemClick += OnItemClick;
speakersRecyclerView.SetAdapter(speakersAdapter);
loadingSpinner.Visibility = ViewStates.Gone;
});
});
.....
.....
}
Гудлак, не стесняйтесь вернуться, если вы есть вопросы!