首页 > 解决方案 > 如何在同步函数中调用异步函数?

问题描述

我希望来自异步函数的数据作为一个列表返回,该列表将在同步函数内分配一个列表。我在 xamarin android 的 Fragment 的 OnCreateView 方法中调用异步函数,它返回一个列表。当异步方法去获取数据时,它进入等待模式。当它等待数据返回时,它会退出函数并阅读下面调用它的同步方法的代码行。当异步函数无法返回列表时。它导致我的活动列表为空并且不显示任何数据。

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using OSDAMobileModel;
using System.Net.Http;
using Newtonsoft.Json;
using System.Threading.Tasks;
using System.Collections;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace OSDAMobileApp
{
    public class CheckInFragment : Fragment
    {
        List<Route> lstRoute = new List<Route>();
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);


        }

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

            var view = inflater.Inflate(Resource.Layout.SelectRoute, container, false);
            ListView routesListView = view.FindViewById<ListView>(Resource.Id.ListView);
            List<Route> routeslst = lstRoute;
             OnAppearing();

            routesListView.Adapter = new CustomListAdapter(lstRoute);         


          return view;
        }


        protected async Task<List<Route>> OnAppearing()
        //protected  List<Route> OnAppearing()
        {
            SetupFiles setupFiles = new SetupFiles();
            //PRPMaster prpMaster = new PRPMaster();
            var prpDetails = await setupFiles.LoadTextAsync("PRPDetails.txt");

            PRPMaster prpMaster = JsonConvert.DeserializeObject<PRPMaster>(prpDetails);

            foreach (var item in prpMaster.PRPDetails)
            {
                lstRoute.Add(item.Route);
            }
           return lstRoute;

        }


    }
}

标签: xamarinxamarin.android

解决方案


我建议您async直接在函数中修改列表,然后通过调用将更改通知适配器:

RunOnUiThread(() => routesListView.Adapter.NotifyDataSetChanged());

顺便说一句,你OnAppearing称之为Task.Run(() => OnAppearing());

所以它最终会像:

ListView routesListView;
List<Route> lstRoute = new List<Route>();

...

public  override View  OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    var view = inflater.Inflate(Resource.Layout.SelectRoute, container, false);
    routesListView = view.FindViewById<ListView>(Resource.Id.ListView);

    routesListView.Adapter = new CustomListAdapter(lstRoute);         

    Task.Run(() => OnAppearing());

    return view;
}

...

protected async Task OnAppearing()
{
    SetupFiles setupFiles = new SetupFiles();
    //PRPMaster prpMaster = new PRPMaster();
    var prpDetails = await setupFiles.LoadTextAsync("PRPDetails.txt");

    PRPMaster prpMaster = JsonConvert.DeserializeObject<PRPMaster>(prpDetails);

    foreach (var item in prpMaster.PRPDetails)
    {
        lstRoute.Add(item.Route);
    }

    // This is necessary for the adapter to update its data
    RunOnUiThread(() => routesListView.Adapter.NotifyDataSetChanged());
}

HIH


推荐阅读