2016-04-14 10 views
3

Ich schreibe Android App in Xamarin C#.Herunterladen von Informationen aus JSON (Xamarin C#)

Ich analysiere Informationen von JSON und zeige es dann in Feldern.

Ich benutze diesen Code:

string url2 = "http://papajohn.pp.ua/?mkapi=getProductsByCat&cat_id=74"; 
     JsonValue json = await FetchAsync(url2); 
private async Task<JsonValue> FetchAsync(string url) 
    { 
     // Create an HTTP web request using the URL: 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url)); 
     request.ContentType = "application/json"; 
     request.Method = "GET"; 

     // Send the request to the server and wait for the response: 
     using (WebResponse response = await request.GetResponseAsync()) 
     { 
      // Get a stream representation of the HTTP web response: 
      using (Stream stream = response.GetResponseStream()) 
      { 
       // Use this stream to build a JSON document object: 
       JsonValue jsonDoc = await Task.Run(() => JsonObject.Load(stream)); 
       //dynamic data = JObject.Parse(jsonDoc[15].ToString); 
       Console.Out.WriteLine("Response: {0}", jsonDoc.ToString()); 


       // Return the JSON document: 
       return jsonDoc; 
      } 
     } 
    } 

Aber ich habe ein Problem. Wenn ich die Aktivität aktiviere, bleibt sie für 2-3 Sekunden stehen und alle Infos erscheinen in den Feldern.

Kann ich diesen Daten-Download reibungslos machen. Erstes Feld, dann zweites usw.

Und wenn ich kann, wie?

+0

Sie könnten Volley verwenden, z.B. http://www.androidhive.info/2014/09/android-json-parsing-using-volley/ –

+0

Dies ist für Java. Ich benutze C# @AlLelopath –

+0

Zeigen Sie, wie Sie 'FetchAsync' aufrufen und setzen Sie die Werte auf Ihrer Ansicht. –

Antwort

1

Ich würde empfehlen, die ordnungsgemäße Verwendung von async/await in C# zu implementieren und zu HttpClient zu wechseln, der auch die ordnungsgemäße Verwendung von async/await implementiert. Unten finden Sie ein Codebeispiel ist, dass Ihre Json außerhalb des UI-Thread abruft:

var url2 = "http://papajohn.pp.ua/?mkapi=getProductsByCat&cat_id=74"; 
var jsonValue = await FetchAsync(url2); 

private async Task<JsonValue> FetchAsync(string url) 
{ 
    System.IO.Stream jsonStream; 
    JsonValue jsonDoc; 

    using(var httpClient = new HttpClient()) 
    { 
    jsonStream = await httpClient.GetStreamAsync(url); 
    jsonDoc = JsonObject.Load(jsonStream); 
    } 

    return jsonDoc; 
} 

Wenn Sie schreiben Ihren Code in einem Android-Projekt, müssen Sie den System.Net.Http DLL als eine hinzufügen Referenz. Wenn Sie Ihren Code in aPCL schreiben, müssen Sie die Microsoft Http Client Libraries Nuget Package installieren. Um die Leistung noch zu verbessern, empfehle ich die Verwendung von ModernHttpClient, die auch von Nuget installiert werden kann.

1

Ihre Async-Verwendung in HttpWebRequest ist korrekt. Ein falscher Aufruf dieser Methode von Activity könnte zum Einfrieren der Benutzeroberfläche führen. Ich werde erklären, wie man unten ruft.

Ich würde auch empfehlen, ModernHttpClient-Bibliothek zu verwenden, um den API-Aufruf zu beschleunigen.

public static async Task<ServiceReturnModel> HttpGetForJson (string url) 
    { 

     using (var client = new HttpClient(new NativeMessageHandler())) 
     { 

      try 
      { 
       using (var response = await client.GetAsync(new Uri (url))) 
       { 
        using (var responseContent = response.Content) 
        { 
         var responseString= await responseContent.ReadAsStringAsync(); 
         var result =JsonConvert.DeserializeObject<ServiceReturnModel>(responseString); 
        } 
       } 
      } 
      catch(Exception ex) 
      { 
       // Include error info here 
      } 
      return result; 

     } 

    } 

Sie müssen Xamarin Komponenten ModernHttpClient und JSON.NET (Newtonsoft.Json)

Aufrufen diese Methode von Aktivität schließen, ohne UI

protected override void OnCreate (Bundle bundle) 
    { 
     base.OnCreate (bundle); 

     SetContentView (Resource.Layout.Main); 
     // After doing initial Setups 
     LoadData(); 
    } 

// This method downloads Json asynchronously without blocking UI and without showing a Pre-loader. 
async Task LoadData() 
    { 
     var newRequestsResponse =await ServiceLayer.HttpGetForJson (newRequestsUrl); 
     // Use the data here or show proper error message 
    } 

// This method downloads Json asynchronously without blocking UI and shows a Pre-loader while downloading. 
async Task LoadData() 
    { 
     ProgressDialog progress = new ProgressDialog (this,Resource.Style.progress_bar_style); 
     progress.Indeterminate = true; 
     progress.SetProgressStyle (ProgressDialogStyle.Spinner); 
     progress.SetCancelable (false); 
     progress.Show(); 
     var newRequestsResponse =await ServiceLayer.HttpGetForJson (newRequestsUrl); 
     progress.Dismiss(); 
     // Use the data here or show proper error message 
    } 

Materialart Loader Stil zu blockieren. Um in Ressourcen/Werte/Style.xml enthalten sein

<style name="progress_bar_style"> 
<item name="android:windowFrame">@null</item> 
<item name="android:windowBackground">@android:color/transparent</item> 
<item name="android:windowIsFloating">true</item> 
<item name="android:windowContentOverlay">@null</item> 
<item name="android:windowTitleStyle">@null</item> 
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> 
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item> 
<item name="android:backgroundDimEnabled">true</item> 
<item name="android:background">@android:color/transparent</item>