2016-04-25 12 views
1

Here is a picture of the screen output Ich mache eine App für Klasse, die Bestandsinformationen von einer API abrufen soll. Ich habe eine Methode zum Abrufen von JSON-Daten basierend auf dem Eingabesymbol eines Benutzers eingerichtet. Es gibt momentan zwei Textansichten, eine zeigt den Firmennamen und eine zeigt den Lagerwechselwert. Es wird jedoch nur die Textansicht angezeigt, deren Text zuerst angezeigt wird. Die andere Ansicht bleibt davon unberührt. Hier ist die Konsole ausgegeben, wenn die Suchtaste geklickt wird:Android-App zeigt nur ein JSON-Element an

04-24 23: 24: 29,782 8144-8589/com.webdesigners.stockmarket W/System.err: android.view.ViewRootImpl $ CalledFromWrongThreadException: Nur die Der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren. 04-24 23: 24: 29.783 8144-8589/com.webdesigners.stockmarket W/System.err: bei android.view.ViewRootImpl.checkThread (ViewRootImpl.java:6357) 04-24 23: 24: 29.783 8144- 8589/com.webdesigners.stockmarket W/System.err: bei android.view.ViewRootImpl.invalidateChildInParent (ViewRootImpl.java:909) 04-24 23: 24: 29.783 8144-8589/com.webdesigners.stockmarket W/System. err: at android.view.ViewGroup.invalidateChild (ViewGroup.java:4690) 04-24 23: 24: 29.783 8144-8589/de.webdesigners.stockmarket W/System.err: at android.view.View.invalidateInternal (View.java:11801) 04-24 23: 24: 29.783 8144-8589/com.webdesigners.stockmarket W/System.err: at android.view.View.invalidate (View.java:11765) 04-24 23 : 24: 29.783 8144-8589/com.webdesigners.stockmarket W/System.err: bei android.view.View.invalidate (View.java:11749) 04-24 23: 24: 29.783 8144-8589/com.webdesigners.stockmarket W/System.err: bei android.widget.TextView.checkForRelayout (TextView.java:6850) 04-24 23: 24: 29.783 8144- 8589/com.webdesigners.stockmarket W/System.err: bei android.widget.TextView.setText (TextView.java:4057) 04-24 23: 24: 29.783 8144-8589/com.webdesigners.stockmarket W/System. err: at android.widget.TextView.setText (TextView.java:3915) 04-24 23: 24: 29.783 8144-8589/com.webdesigners.stockmarket W/System.err: at android.widget.TextView.setText (TextView.java:3890) 04-24 23: 24: 29.784 8144-8589/com.webdesigners.stockmarket W/System.err: at com.webdesigners.stockmarket.MainActivity $ 1 $ 1.onResponse (MainActivity.java:74) 04-24 23: 24: 29.784 8144-8589/com.webdesigners.stockmarket W/System.err: bei okhttp3.RealCall $ AsyncCall.execute (RealCall.java:133) 04-24 23: 24: 29.784 8144-8589/com.webdesigners.stockmarket W/System.err: bei okhttp3.internal.NamedRunnable.run (NamedRunnable.java:32) 04-24 23: 24: 29.784 8144- 8589/com.webdesigners.stockmarket W/System.err: bei java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) 04-24 23: 24: 29.784 8144-8589/com.webdesigners.stockmarket W/System.err: bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:587) 04-24 23: 24: 29.784 8144-8589/com.webdesigners.stockmarket W/System.err: bei Java. lang.Thread.run (Thread.java:818)

 searchButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      String userSymbol = searchEditText.getText().toString(); 

      try 
      { 
       OkHttpClient client = new OkHttpClient(); 
       Request request = new Request.Builder().url("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20%28%22" + userSymbol + "%22%29&env=store://datatables.org/alltableswithkeys&format=json").build(); 
       client.newCall(request).enqueue(new Callback() { 
        @Override 
        public void onFailure(Call call, IOException e) { 
         e.printStackTrace(); 
        } 

        @Override 
        public void onResponse(Call call, final Response response) throws IOException { 
         if (!response.isSuccessful()) 
         { 

         } 
         else 
         { 
          String responseData = response.body().string(); 
          try 
          { 
           TextView symbol = (TextView)findViewById(R.id.symbol); 
           TextView change = (TextView)findViewById(R.id.change); 

           //get object at "quote" level where most attributes are 
           JSONObject jsonObject = new JSONObject(responseData); 
           JSONObject query = jsonObject.getJSONObject("query"); 
           JSONObject results = query.getJSONObject("results"); 
           JSONObject quote = results.getJSONObject("quote"); 

           Long changeValue = quote.getLong("Change"); 
           String changeString = Long.toString(changeValue); 
           assert change != null; 
           change.setText(changeString); 

           assert symbol != null; 
           String companyName = quote.getString("Name"); 
           String companyNameConcat = "Name: " + companyName; 
           symbol.setText(companyNameConcat); 

          } 
          catch(Exception e) 
          { 
           e.printStackTrace(); 
          } 
         } 
        } 
       }); 
      } 
      catch(Exception e) 
      { 

      } 
     } 
    }); 

Antwort

0

Ihre Rückrufe werden nicht ausgeführt der Hauptfaden.Das ist der Grund für die Fehler, die Sie sehen. Rufen Sie runOnUiThread auf, wenn Sie die Benutzeroberfläche aktualisieren müssen.

+0

Das hat funktioniert! Ich habe die Textsetter einfach in eine runOnUiThread (new Runnable (...)) Methode eingefügt und es hat funktioniert! Danke –

+0

Das ist großartig @Daniel! –

0

Nachdem der

String responseData = response.body().string(); 
try 
{ 

setzen Sie eine for-Schleife dort. Zum Beispiel:

for (int i = 0; i < 2; i++) { 
// Code here 
} 
0
Long changeValue = quote.getLong("Change"); 
String changeString = Long.toString(changeValue); 
assert change != null; 
change.setText(changeString); 

// Ändern Sie den obigen Code zu

assert change != null; 
String changeValue = quote.getString("Change"); 
change.setText(changeValue); 

Shop change als String, Abruf- als String und konvertieren Long

Verwandte Themen