簡體   English   中英

Xamarin Android 異步等待不等待方法

[英]Xamarin Android async await not await method

我正在做一個 Xamarin Android 項目,我不想將我的 SQLite 數據庫中的對象列表顯示到 RecyclerView 中。

RecyclerView 位於 Fragment 中。 我不想在打開這個片段時顯示列表,當我從一個活動返回到這個片段時,我不想刷新回收者視圖的數據。

知道我得到了正確的值,但我不知道為什么不等待GetMyObjectsAsync結果 為什么?

using System.Collections.Generic;
using System.Threading.Tasks;
using Android.OS;
using Android.Support.V7.Widget;
using Android.Views;
using Microsoft.Practices.ServiceLocation;
using System.Linq;
using Android.App;
using Android.Widget;
using Android.Util;
using System;

namespace POCProject.Droid.Fragments
{
    public class MyCustomFragment : Fragment
    {

        private IMyObjectsService _myObjectsService;

        List<ObjModel> myObjects { get; set; } = new List<ObjModel>();

        RecyclerView mRecyclerView;

        RecyclerView.LayoutManager mLayoutManager;

        MyObjectsRecyclerViewAdapter mAdapter;



        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            _myObjectsService = ServiceLocator.Current.GetInstance<IMyObjectsService>();

        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {

            View view = inflater.Inflate(Resource.Layout.fragment_my_objects_list, container, false) as View;

            mRecyclerView = view.FindViewById<RecyclerView>(Resource.Id.MyRecyclerView);


            mLayoutManager = new LinearLayoutManager(mRecyclerView.Context);


            mRecyclerView.SetLayoutManager(mLayoutManager);

            return view;
        }

        public override void OnResume()
        {
            base.OnResume();
            Task.Run(async () => { 
                try
                {
                    myObjects = await GetMyObjectsAsync(); // Here it's not awaited the result why ?
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

            });
            mAdapter = new MyObjectsRecyclerViewAdapter(myObjects);
            Console.WriteLine("--------------------OnResume Called-------------------- " + myObjects.Count()); // Always 0 why ?

            mRecyclerView.SetAdapter(mAdapter);
        }



        private async Task<List<ObjModel>> GetMyObjectsAsync(){
            Console.WriteLine("--------------------GetMyObjectsAsync Called--------------------");
            var result = await _myObjectsService.GetAllAsync(); // Get objects in sqlite databases
            Console.WriteLine("-------------------- result" + result.Value.Count() + "--------------------");  // Return the correct value for example 5

            List<ObjModel> myOjectsTmp = new List<ObjModel>();


            if (!result.HasErrors && result.HasValue)
            {
                foreach (var obj in result.Value)
                {
                    myOjectsTmp.Add(obj);
                }
                Console.WriteLine("-------------------- myOjectsTmp"+ myOjectsTmp.Count() + "--------------------"); // Return the correct value for example 5
            }

            return myOjectsTmp;
        }


    }
}

嘗試這個:

移動這兩行:

mAdapter = new MyObjectsRecyclerViewAdapter(myObjects);
mRecyclerView.SetAdapter(mAdapter);

 myObjects = await GetMyObjectsAsync();

喜歡:

   myObjects = await GetMyObjectsAsync();
Activity.RunOnUiThread(() =>
                    {
    mAdapter = new MyObjectsRecyclerViewAdapter(myObjects);
    mRecyclerView.SetAdapter(mAdapter);
 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM