2017-10-17 9 views
0

私の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); 

    } 
+1

OnCreate自体は、入力したアクションのUIスレッドにあり、非同期ではなく、GetCustInfoの呼び出しを待っていません。それはブロッキングコールのように振る舞います。 UIライフサイクルで別のイベントを使用して起動し、 'await'構文を使用して呼び出します。 – dlatikay

+0

あなたは何を意味するの例を挙げることができますか? UIライフサイクルのすべてのイベントがUIスレッドの一部であるとは限りませんか? –

+0

私はいくつかの調査を行い、ライフサイクル内のOnStart呼び出しでcustinfoへの呼び出しを追加する必要があることを発見しました。それは働いている。ヒントをありがとう! –

答えて

0

変更

this.tableItems = await customer.GetCustInfo(.. 

とお知らせへの呼び出し..あなたが待望ない呼び出しからの結果を使用している次の行で 、それは明らかにハングアップするでしょう、クラッシュどんな:

this.listView.Adapter = new ListOfLocationAdapter(this, **this.tableItems**); //this.tableItems is just empty 
+0

あなたのOnCreateの完全な内容で非同期機能を作成し、それを待たずに呼び出すだけで、スピードアップしたいものをすることができます。 –

関連する問題