Как вызвать асинхронную функцию в синхронной функции? - PullRequest
0 голосов
/ 08 октября 2018

Я хочу, чтобы данные из функции async возвращались в виде списка, которому будет назначен список внутри синхронной функции.Я вызываю асинхронную функцию в методе OnCreateView Fragment в xamarin android, который возвращает список.Когда async метод идет и получает данные, он переходит в режим ожидания.Когда он ожидает возврата данных, он выходит из функции и читает строки кода синхронного метода, где он вызывается.Когда async функция не может вернуться к списку.Это вызывает пустой список в моей деятельности и не показывает данных.

Вот мой код:

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;

        }


    }
}

1 Ответ

0 голосов
/ 08 октября 2018

Я бы посоветовал вам изменить список в вашей функции 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...