Android应用只显示一个JSON元素

时间:2016-04-25 03:26:01

标签: android json okhttp3

Here is a picture of the screen output我正在为类创建一个应用程序,用于从API检索库存信息。我已经设置了一种基于用户输入股票代码检索JSON数据的方法。现在有两个文本视图,一个显示公司名称,另一个显示库存变化值。但是,仅显示首先设置其文本的textview,然后另一个不受影响。 单击搜索按钮时,这是控制台输出:

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(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:at 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:at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 04-24 23:24:29.784 8144-8589 / com.webdesigners.stockmarket W / System.err:at 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)
            {

            }
        }
    });

3 个答案:

答案 0 :(得分:0)

之后

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

在那里放一个for循环。例如:

for (int i = 0; i < 2; i++) {
// Code here
}

答案 1 :(得分: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);

change存储为String,将其检索为String并转换为Long

答案 2 :(得分:0)

您的回调不会在主线程上执行。这就是你看到错误的原因。 需要更新UI时调用runOnUiThread。