Я делаю приложение для класса, которое должно получать информацию об акциях из 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: at 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 : в android.widget.TextView.checkForRelayout (TextView.java:6850) 04-24 23: 24: 29.783 8144-8589 / com.webdesigners .stockmarket W / System.err: в android.widget.TextView.setText (TextView.java:4057) 04-24 23: 24: 29.783 8144-8589 / com.webdesigners.stockmarket W / System.err: в android.widget .TextView.setText (TextView.java:3915) 04-24 23: 24: 29.783 8144-8589 / com.webdesigners.stockmarket W / System.err: на 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. ошибка: в 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 / Syste m.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)Can't load full resultsTry againRetrying...Retrying...
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 ответа
Ваши обратные вызовы выполняются не в основном потоке. Это причина ошибок, которые вы видите. Вызовите runOnUiThread, когда вам нужно обновить пользовательский интерфейс.
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
После
String responseData = response.body().string();
try
{
Поместите туда цикл for. Например:
for (int i = 0; i < 2; i++) {
// Code here
}
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.