2011-12-28 7 views
2

내가 원하는 것은 사용자가 웹 서비스가 처리 중임을 알고 작업을 시도하는 동안 반복적으로 단추를 매시지 않도록하기 위해서입니다.MonoDroid ProgressDialog

 EditText partnumber = (EditText)FindViewById(Resource.Id.itemNumber); 
     partnumber.FocusChange += (object sender, View.FocusChangeEventArgs e) => 
     { 
      if (!e.HasFocus) 
      { 
       var pd = ProgressDialog.Show(this, "Processing", "Please Wait...", false); 
       var res = new InventoryApp(); 
       res.partValidateCompleted += delegate { pd.Hide(); }; 
       var isValid = res.partValidate(partnumber.Text); 
       if (isValid == "Not Found") 
       { 
        partnumber.Text = ""; 
        partnumber.RequestFocus(); 
        partqty.ClearFocus(); 
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.SetTitle("Invalid Part"); 
        builder.SetMessage("Part number does not exist in database. Please ensure you are entering the correct part number and try again"); 
        builder.SetPositiveButton("OK", delegate { }); 
        var dialog = builder.Create(); 
        dialog.Show(); 
       } 
       else 
       { 
        partdesc.Text = isValid; 
       } 
      } 
     }; 

pd.Hide()를 코드에 그대로두면 progressdialog가 표시되지 않습니다. 웹 서비스가 결과를 반환 한 후에 progressdialog 만 보았고 아무 곳에 나 숨겨 두지 않았기 때문에 계속 남아 있습니다. 앱이 partValidate를 기다리는 동안 어떻게 보이게 할 수 있습니까? 언제 숨길 수 있습니까?

답변

5

코드에서 판단하면 partValidate() 메서드가 동기식 인 것처럼 보입니다. 이 코드는 UI 스레드에서 실행되므로 해당 메서드 호출이 지속되는 동안 앱의 UI가 차단되므로 UI ​​업데이트가 끝날 때까지 UI 업데이트가 표시되지 않는 이유가 설명됩니다. 처리의 다양한 방법을 설명하는 here을 게시

partnumber.FocusChange += (object sender, View.FocusChangeEventArgs e) => 
{ 
    if (!e.HasFocus) 
    { 
     var pd = ProgressDialog.Show(this, "Processing", "Please Wait...", false); 
     var res = new InventoryApp(); 
     res.partValidateCompleted += delegate { pd.Hide(); }; 

     ThreadPool.QueueUserWorkItem(state => 
     { 
      var isValid = res.partValidate(partnumber.Text); 

      RunOnUiThread(() => 
      { 
       if (isValid == "Not Found") 
       { 
        partnumber.Text = ""; 
        partnumber.RequestFocus(); 
        partqty.ClearFocus(); 
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.SetTitle("Invalid Part"); 
        builder.SetMessage("Part number does not exist in database. Please ensure you are entering the correct part number and try again"); 
        builder.SetPositiveButton("OK", delegate { }); 
        var dialog = builder.Create(); 
        dialog.Show(); 
       } 
       else 
       { 
        partdesc.Text = isValid; 
       } 
      } 
     } 
    } 
}; 

나는 블로그가 : 당신은 UI를 업데이트해야 후에는 백그라운드 스레드에서 호출을 실행 한 다음 UI 스레드로 다시 이동하여이 문제를 얻을 수 Android 애플리케이션 용 Mono에 대한이 시나리오가 있습니다.

+0

트릭을 수행하는 것 같습니다. 감사!! 내 webmethod가 비동기적인 것이 더 낫지 않습니까? 아니면 이것이 더 효율적입니까? – jmease

+0

나는 그것이 효율성보다 하나의 방법에 가장 적합한 방법이 더 중요하다는 것을 말하고 싶다. 웹 호출을 비동기로 만드는 것은 코드 정리에 유용 할 수 있지만 그 방법의 클라이언트는 비동기 적으로 작업해야합니다. 개인적으로, 이와 같은 경우에 비동기 적으로 호출하기를 좋아하고 결과를 처리하기위한 메서드에 대리자를 전달하는 것이 좋습니다. –

0

내가 partValidate 귀하의 질문 코드에서 이해 async 있지만 OnComplete 콜백에 대한 매개 변수가 없습니다. 당신은 그것을 추가하여 문제를 해결할 수 있으며, 코드는 다음과 같이 될 것입니다 :

var isValid = res.partValidate(partnumber.Text,() => {pd.Hide();}); 

그러나 더 나은 방법은 웹 서비스 호출에 대한 AsyncTask 클래스의 구현을 만드는 것입니다. 여기에서 찾을 수 있습니다 demo

+0

progressdialog가 다른 것보다 더 자주 표시 될 때와 같은 것으로 보입니다. partValidate가 실행될 때까지 표시되지 않습니다. 내가 잃어버린 뭔가 명확한 경우에 대비하여 전체 코드를 추가했습니다. – jmease