2017-05-02 10 views
0

Ich bin ein Neuling zu Xamarin Android und C#, ich möchte einen Fortschrittsbalken (Ladekreis) hinzufügen, während die API die Ergebnisse zurückgibt.Wie füge ich einen Fortschrittsbalken (Ladekreis) hinzu, während die API die Ergebnisse zurückgibt?

Das ist mein Progress Bar,

ProgressBar mProgressBar = FindViewById<ProgressBar>(Resource.Id.progressBarConfirmJob); 

mProgressBar.Visibility = ViewStates.Visible; 

Ich habe die folgende API auf die Schaltfläche Click-Ereignis,

btnSubmit.Click += async (sender, e) => 
     { 
      var jobId = txtJobID.Text; 

      if (txtJobID.Text.Length <= 0) 
      { 
       txtJobID.RequestFocus(); 
       txtJobID.SetError("Job ID required", iconError); 
      } 
      else 
      { 
       var request = HttpWebRequest.Create(string.Format("http://192.168.79.174:90/api/test/" + jobId)); 
       request.ContentType = "application/json"; 
       request.Method = "GET"; 

       mProgressBar.Visibility = ViewStates.Visible; 


       using (HttpWebResponse response = await request.GetResponseAsync() as HttpWebResponse) 
       { 

        if (response.StatusCode != HttpStatusCode.OK) 
         Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode); 

        using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
        { 
         var content = reader.ReadToEnd(); 

         dynamic arr = JsonConvert.DeserializeObject(content); 

         foreach (dynamic obj in arr) 
         { 
          tvJobID.Text = obj.JobID; 
          tvJobType.Text = obj.JobType; 
          tvDueDate.Text = obj.DueDate; 
          tvVisitTime.Text = obj.Time; 
          tvVisitStatus.Text = obj.VisitStatus; 
          tvAddress1.Text = obj.Address1; 
          tvAddress2.Text = obj.Address2; 
          tvPostCode.Text = obj.PostCode; 
          tvAuthority.Text = obj.Authority; 
         } 

         if (content == null || content == "" || content == "[]") 
         { 

          //Console.Out.WriteLine("Response contained empty body..."); 
          layoutController.Visibility = ViewStates.Invisible; 
          Toast.MakeText(ApplicationContext, "Invalid Job ID or no visits for this ID. Please try again", ToastLength.Long).Show(); 
         } 
         else 
         { 
          layoutController.Visibility = ViewStates.Visible; 


         } 
        } 
       } 
      } 

     }; 

Ich habe dies in der .axml

<RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="51.0dp" 
      android:minWidth="25px" 
      android:minHeight="25px"> 
      <ProgressBar xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/progressBarRaiseJob" 
       android:layout_centerInParent="true" /> 
     </RelativeLayout> 

Wie kann Ich zeige den Fortschrittsbalken an, bis die Web-API Ergebnisse zurückgibt. Im Moment erscheint Progress Balken für 2 Sekunden und dann eingefroren, bis die API Ergebnisse zurückgibt, nehme ich an, dass das Problem mit dem asynchronen Prozess ist? Jede Idee, wo ich falsch liege, Vielen Dank für die ganze Hilfe

+0

Versuchen Sie, Ereignisse oder async/await zu verwenden, damit Sie den UI-Thread nicht blockieren. – mrousavy

+0

Ich habe das Aync hinzugefügt und warte ab, aber wo soll ich die ProgressBar verwenden? – KMR

Antwort

0

In async Aufgabe, in pre Ausführen Methode Anzeige der Fortschrittsbalken und in nach Ausführen Methode entfernen Sie den Fortschrittsbalken. Verwende Sichtbarkeitsoptionen, um die Leiste zu entfernen.

Verwandte Themen