私のXamarin Androidアプリの動作が遅いので、パフォーマンスを向上させるために非同期/待機コードを追加しました。 APIスレッドをUIスレッドから除外したかったのです。私はこれがasync/awaitを使用する絶好の機会だと思った。そこで、関数のシグネチャにasyncを追加し、戻り値の型の周りにTaskをラップしました。その後、RestSharp GET呼び出しを "await client.ExecuteTaskAsync"で更新しました。私がこれをしたらGetCustInfo関数への呼び出しを更新する必要があることがわかりました。呼び出しの最後に.Resultを追加するだけでエラーは表示されませんでした。問題は、GetCustInfoの呼び出しでハングアップし、ちょうど動作しないことです。Xamarin Androidアプリ - パフォーマンスを向上させるためにasync/API呼び出しを待ちます。
私はここで間違っていますか?
public async Task<List<CustInfo>> GetCustInfo(string strBranchNumber, string dblCurrentXCoordinate, string dblCurrentYCoordinate)
{
if (this.strBearerToken == string.Empty)
{
throw new ArgumentException("No Bearer Token Found");
}
try
{
var restUrl = this.strCustomerInfoAPIURL;
var uri = new Uri(string.Format(restUrl, string.Empty));
var client = new RestClient(uri);
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "bearer " + this.strBearerToken);
request.AddParameter("intBranchNumber", strBranchNumber);
request.AddParameter("intZipCode", this.strZipCode);
request.AddParameter("intCustomerType", this.strCustomerType);
request.AddParameter("intMinTotalAmount", this.strMinRevenue);
request.AddParameter("dblCurrentXCoordinate", dblCurrentXCoordinate);
request.AddParameter("dblCurrentYCoordinate", dblCurrentYCoordinate);
request.AddParameter("bolGetLocation", true);
var response = await client.ExecuteTaskAsync(request);
return JsonConvert.DeserializeObject<List<CustInfo>>(response.Content).OrderBy(x => x.ApproxDistance).ToList();
}
catch (Exception ex)
{
return null;
}
}
だから何が起こっていることは)私は私のOnCreate関数から非同期/のawait関数を呼び出すときに私はcustomer.GetCustomerInfo(コールしようとすると、それだけで停止しています。
protected override void OnCreate(Bundle bundle)
{
....
this.tableItems = customer.GetCustInfo(
"xxxxxxx",
this.currentLocation.Latitude.ToString(),
this.currentLocation.Longitude.ToString()).Result;
this.listView.Adapter = new ListOfLocationAdapter(this, this.tableItems);
}
OnCreate自体は、入力したアクションのUIスレッドにあり、非同期ではなく、GetCustInfoの呼び出しを待っていません。それはブロッキングコールのように振る舞います。 UIライフサイクルで別のイベントを使用して起動し、 'await'構文を使用して呼び出します。 – dlatikay
あなたは何を意味するの例を挙げることができますか? UIライフサイクルのすべてのイベントがUIスレッドの一部であるとは限りませんか? –
私はいくつかの調査を行い、ライフサイクル内のOnStart呼び出しでcustinfoへの呼び出しを追加する必要があることを発見しました。それは働いている。ヒントをありがとう! –