2016-04-25 68 views
1

Here is a picture of the screen output我正在爲從API檢索股票信息的類製作應用程序。我已經設置了一種基於用戶的輸入股票代碼檢索JSON數據的方法。現在有兩個textview,一個顯示公司名稱和一個顯示股票變化值的顯示視圖。但是,只有顯示其文本集的textview纔會顯示,然後另一個不受影響。 這裏是搜索按鈕被點擊時的控制檯輸出:Android應用程序將只顯示一個JSON元素

04-24 23:24:29.782 8144-8589/com.webdesigners.stockmarket W/System.err的:android.view.ViewRootImpl $ CalledFromWrongThreadException:只有創建視圖層次結構的原始線程可以觸及其視圖。 04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err:at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357) 04-24 23:24:29.783 8144- 8589/com.webdesigners.stockmarket W/System.err:at 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/com.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:at android.view.View.invalidate(View.java:11749) 04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err:at android.widget.TextView.checkForRelayout(TextView.java:6850) 04-24 23:24:29.783 8144- 8589/com.webdesigners.stockmarket W/System.err:at 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( (MainActivity.java:74) 04-24 23:24:29.784 8144-8589/com.webdesigners.stockmarket W/System.err:在okhttp3.RealCall $ AsyncCall.execute(RealCall.java:133) 04-24 23:24:29.784 8144-8589/com.webdesigners.stockmarket W/System.err:at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 04-24 23:24:29.784 8144- 8589/com.webdesigners.stockmarket W/System.err:在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 04-24 23:24:29.784 8144-8589/com.webdesigners.stockmarket W/System.err:在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587) 04-24 23:24:29.784 8144-8589/com.webdesigners.stockmarket W/System.err:at 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) 
      { 

      } 
     } 
    }); 

回答

0

你的回調上執行不主線程。這就是你看到的錯誤的原因。 當您需要更新UI時調用runOnUiThread。

+0

這工作!我只是將文本設置器放入runOnUiThread(新的Runnable(...))方法中,並且它工作正常!謝謝 –

+0

太棒了@Daniel! –

0

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

在那裏放置一個for循環。例如:

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); 

//更改上面的代碼

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

商店changeString,檢索它作爲String,並轉換爲Long

相關問題