2017-10-17 6 views
0

내 Xamarin Android 앱이 느리게 실행되는 것을 발견 했으므로 성능을 향상시키기 위해 일부 비동기/대기 코드를 추가했습니다. UI 스레드에서 내 API 호출을 제외하고 싶었습니다. 나는 이것이 async/await를 사용할 수있는 완벽한 기회라고 생각했다. 그래서, 함수의 서명에 async를 추가하고 반환 값 유형에 대해 Task를 래핑했습니다. 그런 다음 RestSharp GET 호출을 "await client.ExecuteTaskAsync"로 업데이트했습니다. 일단이 작업을 수행하면 GetCustInfo 함수에 대한 호출을 업데이트해야한다는 것을 알았습니다. 나는 호출의 마지막에 .Result를 추가하기 만하면 오류가 표시되지 않았다. 문제는 GetCustInfo 호출에 응답하지 않고 작동하지 않는다는 것입니다.Xamarin Android 앱 - 성능 향상을 위해 async/API 호출을 기다리는 중 문제가 발생했습니다.

내가 뭘 잘못하고 있니? 나는에서 비동기/await를 함수를 호출 할 때

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 내가 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의 전체 내용으로 비동기 func을 만들고 기다리지 않고 호출하면 속도가 향상되고 원하는대로 할 수 있습니다. –