期待已久的我有使用返回的從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