期待已久的我有使用返回的从REST API接收到的文章列表的片段。该REST API是async
我用await
等待它完成。当完成时,我的数据(即List<Article>
)传递给被叫listofarticles
变量,并用它来创建一个ArrayAdapter
。呼叫到异步方法不Xamarin的Android
我在OnCreate
上面的代码做了这个片段的方法,它应该在OnCreateView
之前运行,据我所知。
我的代码工作中的活动而不是一个片段。
问题: 到awaitable REST方法的调用不等待。
当线调试线它是这样的:
OnCreate
被调用。加工,我叫awaitable方法行(即是为了填补listofarticles
),并简单地跳到OnCreateView
。因此listofarticles
为空。OnCreateView
被称为和处理。此时,程序只能返回到它所称的活动。我不能再调试,因为Xamarin工作室认为我已经结束了,但在模拟器,它只是开始后,这一切都调用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;
}
}
似乎更好的解决方案,接受。 – VSG24
您也可以以同步的方式使用异步REST API。这样做会简化你的代码,但是会阻塞UI线程直到你得到结果。 – Kalitsov