Android 应用将只显示一个 JSON 元素
Android app will only display one JSON element
我正在为 class 制作一个应用程序,用于从 API 检索股票信息。我已经设置了一种方法来根据用户输入的股票代码检索 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: 在 android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)
04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:909)
04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 android.view.ViewGroup.invalidateChild(ViewGroup.java:4690)
04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 android.view.View.invalidateInternal(View.java:11801)
04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 android.view.View.invalidate(View.java:11765)
04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 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: 在 com.webdesigners.stockmarket.MainActivity$1$1.onResponse(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: 在 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: 在 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)
{
}
}
});
之后
String responseData = response.body().string();
try
{
在那里放一个 for 循环。例如:
for (int i = 0; i < 2; i++) {
// Code here
}
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
您的回调不是在主线程上执行的。这就是您看到错误的原因。
当你需要更新 UI.
时调用 runOnUiThread
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: 在 android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357) 04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:909) 04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 android.view.ViewGroup.invalidateChild(ViewGroup.java:4690) 04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 android.view.View.invalidateInternal(View.java:11801) 04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 android.view.View.invalidate(View.java:11765) 04-24 23:24:29.783 8144-8589/com.webdesigners.stockmarket W/System.err: 在 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: 在 com.webdesigners.stockmarket.MainActivity$1$1.onResponse(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: 在 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: 在 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)
{
}
}
});
之后
String responseData = response.body().string();
try
{
在那里放一个 for 循环。例如:
for (int i = 0; i < 2; i++) {
// Code here
}
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
您的回调不是在主线程上执行的。这就是您看到错误的原因。 当你需要更新 UI.
时调用 runOnUiThread