【发布时间】:2016-01-13 05:21:39
【问题描述】:
我有一个片段,用于返回从 REST API 接收到的文章列表。 REST API 是async,我使用await 等待它完成。完成后,我将数据(即List<Article>)传递给一个名为listofarticles的变量,并使用它创建一个ArrayAdapter。
据我所知,我在该片段的OnCreate 方法中执行上述代码,该方法应该在OnCreateView 之前运行。
我的代码在活动中工作,但在片段中不工作。
问题: 不等待对可等待 REST 方法的调用。
逐行调试时是这样的:
OnCreate被调用。处理到行,我在其中调用等待方法(应该填充listofarticles)并简单地跳到OnCreateView。因此listofarticles为空。OnCreateView被调用和处理。此时程序只是回到它被调用的活动。我无法再调试它,因为 Xamarin Studio 认为我已经完成了,但在模拟器上它只是开始调用 REST 方法,因为
listofarticles中的数据是无用的,因为我可以'现在不要将它传递给适配器。
为什么会发生这种情况以及如何解决?
public class LatestNewsFragment : Android.Support.V4.App.Fragment, ListView.IOnItemClickListener
{
private Context globalContext = null;
private List<Article> listofarticles;
private ArrayAdapter<Article> listAdapter;
public LatestNewsFragment()
{
this.RetainInstance = true;
}
public async override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
globalContext = this.Context;
//Create a progress dialog for loading
ProgressDialog pr = new ProgressDialog(globalContext);
pr.SetMessage("Loading data");
pr.SetCancelable(false);
var rest = new RestAccess();
pr.Show();
//Download the data from the REST API
listofarticles = await rest.ListArticlesAsync ("SomeSource");
pr.Hide();
Console.WriteLine (listofarticles.Capacity);
listAdapter = new ArrayAdapter<Article>(globalContext, Android.Resource.Layout.SimpleListItem1, listofarticles);
}
public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var view = inflater.Inflate(Resource.Layout.Fragment_LatestNews, null);
ListView listView = view.FindViewById<ListView>(Resource.Id.list_latestnews);
listView.Adapter = listAdapter;
listView.OnItemClickListener = this;
return view;
}
}
【问题讨论】:
标签: c# android asynchronous xamarin