gpt4 book ai didi

java - 我的 Android 天气应用程序出现奇怪的 "Only the original thread that created a view hierarchy can touch its views."错误

转载 作者:行者123 更新时间:2023-11-30 05:18:44 25 4
gpt4 key购买 nike

我正在使用以下代码刷新手机显示屏上的天气信息,前 2 - 3 次效果很好,但之后它开始崩溃并给出此错误。

这是代码:

package com.example.ma18uus.myapplication;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.widget.TextView;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.IOException;
import java.io.InputStream;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;


public class weatherView extends AppCompatActivity {


//Main url
static final String main_url = "http://api.weatherapi.com/v1/";
//Live or Weekly forecast
static final String live_weather = "current.xml?key=";
//String sevendays_weather = "orecast.xml?key=";
//API Key + q
static final String API_Key = "c3bdfadb90d5452bb8003318201801&q=";
//Location Setters
static final String location = "London";

//Complete url for todays forecast
static final String URLT = main_url + live_weather + API_Key + location;

//XML node keys
static final String KEY_ITEM = "root";//parent node
static final String KEY_NAME = "name";//name of city, string
static final String KEY_WIND_MPH = "wind_mph";//wind mph, float
static final String KEY_WIND_KPH = "wind_kph";//wind kph, float
static final String KEY_C = "temp_c";//Temperature Celsius, int
static final String KEY_C_FEELS = "feelslike_c";//Temperature feeling Celsius, float
static final String KEY_F = "temp_f";//Temperature Fahrenheit, int
static final String KEY_F_FEELS = "feelslike_f";//Temperature feeling Fahrenheit, float
static final String KEY_HUMIDITY = "humidity";//Humidity Level, int
static final String KEY_CONDITION_TEXT = "text";//Weather Condition i.e. cloudy, sunny, clear, string


ArrayList<HashMap<String, String>> menuItems;

private TextView txt;
String xml;

//@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weather_view);

menuItems = new ArrayList<HashMap<String, String>>();

txt = (TextView) findViewById(R.id.weather_window);

new weatherTask().execute();
// weatherTask.parseXML();
}

private class weatherTask extends AsyncTask<Void, Void, Void>{


@Override
protected Void doInBackground(Void... voids) {
parseXML();
return null;
}

private void parseXML(){


XmlPullParserFactory parserFactory;
try {
parserFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = parserFactory.newPullParser();
try {
InputStream is = new URL(URLT).openStream();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(is, null);

processParsing(parser);

} catch (IOException e) {
e.printStackTrace();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}

}

private void processParsing(XmlPullParser parser) throws IOException, XmlPullParserException{

ArrayList<WeatherConditions> weather = new ArrayList<>();
int eventType = parser.getEventType();
WeatherConditions currentWeather = null;

while(eventType != XmlPullParser.END_DOCUMENT){

String sName = null;

switch(eventType){
case XmlPullParser.START_TAG:
sName = parser.getName();

if ("root".equals(sName)){
currentWeather = new WeatherConditions();
weather.add(currentWeather);
}else if (currentWeather != null){
if ("name".equals(sName)){
currentWeather.name = parser.nextText();
}
else if ("wind_mph".equals(sName)){
currentWeather.wind_mph = parser.nextText();
}else if ("wind_kph".equals(sName)){
currentWeather.wind_kph = parser.nextText();
}else if ("temp_c".equals(sName)){
currentWeather.celsius = parser.nextText();
}else if ("feelsCelsius".equals(sName)){
currentWeather.feelsCelsius = parser.nextText();
}else if ("fahrenheit".equals(sName)){
currentWeather.fahrenheit = parser.nextText();
}else if ("feelsFahrenheit".equals(sName)){
currentWeather.feelsFahrenheit = parser.nextText();
}else if ("humidity".equals(sName)){
currentWeather.humidity = parser.nextText();
}else if ("text".equals(sName)){
currentWeather.condition_text = parser.nextText();
}
}
break;
}

eventType = parser.next();
}

printWeather(weather);
}

private void printWeather(ArrayList<WeatherConditions> weather){

StringBuilder builder = new StringBuilder();

for (WeatherConditions weatherC : weather){

builder.append(weatherC.name).append("\n").append(weatherC.wind_mph).append("\n").append(weatherC.wind_kph).append("\n").append(weatherC.celsius).append("\n").append(weatherC.feelsCelsius).
append("\n").append(weatherC.fahrenheit).append("\n").append(weatherC.feelsFahrenheit).append("\n").append(weatherC.humidity).append("\n").append(weatherC.condition_text).append("\n");

}

txt.setText(builder.toString());
}

}

}

这是错误输出:

01/24 20:06:05: Launching 'app' on Pixel 2 API 29.
$ adb shell am start -n "com.example.ma18uus.myapplication/com.example.ma18uus.myapplication.ClothesApp" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Waiting for process to come online...
Connected to process 24573 on device 'emulator-5554'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
I/s.myapplicatio: The ClassLoaderContext is a special shared library.
D/libEGL: Emulator has host GPU support, qemu.gles is set to 1.
W/libc: Unable to set property "qemu.gles" to "1": connection failed; errno=13 (Permission denied)
D/libEGL: loaded /vendor/lib/egl/libEGL_emulation.so
D/libEGL: loaded /vendor/lib/egl/libGLESv1_CM_emulation.so
D/libEGL: loaded /vendor/lib/egl/libGLESv2_emulation.so
W/RenderThread: type=1400 audit(0.0:300): avc: denied { write } for name="property_service" dev="tmpfs" ino=8445 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:property_socket:s0 tclass=sock_file permissive=0
W/s.myapplicatio: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
W/s.myapplicatio: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
D/HostConnection: HostConnection::get() New Host Connection established 0xdc973e60, tid 24609
D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_3_0
W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0
D/EGL_emulation: eglCreateContext: 0xe7fbaa20: maj 3 min 0 rcv 3
D/EGL_emulation: eglMakeCurrent: 0xe7fbaa20: ver 3 0 (tinfo 0xe7fe5b10)
W/Gralloc3: mapper 3.x is not supported
D/HostConnection: createUnique: call
HostConnection::get() New Host Connection established 0xdc975b70, tid 24609
D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_3_0
D/eglCodecCommon: allocate: Ask for block of size 0x1000
D/eglCodecCommon: allocate: ioctl allocate returned offset 0x3ff805000 size 0x2000
D/EGL_emulation: eglMakeCurrent: 0xe7fbaa20: ver 3 0 (tinfo 0xe7fe5b10)
D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 1 0
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@8f4b1f9
D/NetworkSecurityConfig: Using Network Security Config from resource network_security_config debugBuild: true
D/EGL_emulation: eglMakeCurrent: 0xe7fbaa20: ver 3 0 (tinfo 0xe7fe5b10)
D/EGL_emulation: eglMakeCurrent: 0xe7fbaa20: ver 3 0 (tinfo 0xe7fe5b10)
D/EGL_emulation: eglMakeCurrent: 0xe7fbaa20: ver 3 0 (tinfo 0xe7fe5b10)
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.ma18uus.myapplication, PID: 24573
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$4.done(AsyncTask.java:399)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8191)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1420)
at android.view.View.requestLayout(View.java:24454)
at android.view.View.requestLayout(View.java:24454)
at android.view.View.requestLayout(View.java:24454)
at android.view.View.requestLayout(View.java:24454)
at android.view.View.requestLayout(View.java:24454)
at android.view.View.requestLayout(View.java:24454)
at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:380)
at android.view.View.requestLayout(View.java:24454)
at android.widget.TextView.checkForRelayout(TextView.java:9681)
at android.widget.TextView.setText(TextView.java:6269)
at android.widget.TextView.setText(TextView.java:6097)
at android.widget.TextView.setText(TextView.java:6049)
at com.example.ma18uus.myapplication.weatherView$weatherTask.printWeather(weatherView.java:159)
at com.example.ma18uus.myapplication.weatherView$weatherTask.processParsing(weatherView.java:145)
at com.example.ma18uus.myapplication.weatherView$weatherTask.parseXML(weatherView.java:89)
at com.example.ma18uus.myapplication.weatherView$weatherTask.doInBackground(weatherView.java:73)
at com.example.ma18uus.myapplication.weatherView$weatherTask.doInBackground(weatherView.java:68)
at android.os.AsyncTask$3.call(AsyncTask.java:378)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
at java.lang.Thread.run(Thread.java:919) 
D/EGL_emulation: eglMakeCurrent: 0xe7fbaa20: ver 3 0 (tinfo 0xe7fe5b10)
I/Process: Sending signal. PID: 24573 SIG: 9
Process 24573 terminated.

第一次工作正常,然后我将 celsius 更改为 temp_c,这是 XML 文件中的名称,仍然工作正常。然后,我将 feelsCelsius 更改为 feelslike_c(这是 XML 文件中的名称),崩溃开始发生,甚至在将代码恢复到原始状态后仍然持续发生。我也尝试卸载并重新安装该应用程序,但没有任何效果。

最佳答案

AsyncTask 在非 UI 后台线程中执行 doInBackground()。它无法与 UI 交互。另一方面,onPostExecute 方法在主线程中运行时允许触摸 UI。因此,重构您的 AsyncTask 以获得结果:


private class weatherTask extends AsyncTask<Void, Void, String> { // has result now
@Override
protected Void doInBackground(Void... voids) {

XmlPullParserFactory parserFactory;
try {
parserFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = parserFactory.newPullParser();
try {
InputStream is = new URL(URLT).openStream();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(is, null);

return processParsing(parser);

} catch (IOException e) {
e.printStackTrace();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}

}

private String processParsing(XmlPullParser parser) throws IOException, XmlPullParserException{

ArrayList<WeatherConditions> weather = new ArrayList<>();
int eventType = parser.getEventType();
WeatherConditions currentWeather = null;

while(eventType != XmlPullParser.END_DOCUMENT){

String sName = null;

switch(eventType){
case XmlPullParser.START_TAG:
sName = parser.getName();

if ("root".equals(sName)){
currentWeather = new WeatherConditions();
weather.add(currentWeather);
}else if (currentWeather != null){
if ("name".equals(sName)){
currentWeather.name = parser.nextText();
}
else if ("wind_mph".equals(sName)){
currentWeather.wind_mph = parser.nextText();
}else if ("wind_kph".equals(sName)){
currentWeather.wind_kph = parser.nextText();
}else if ("temp_c".equals(sName)){
currentWeather.celsius = parser.nextText();
}else if ("feelsCelsius".equals(sName)){
currentWeather.feelsCelsius = parser.nextText();
}else if ("fahrenheit".equals(sName)){
currentWeather.fahrenheit = parser.nextText();
}else if ("feelsFahrenheit".equals(sName)){
currentWeather.feelsFahrenheit = parser.nextText();
}else if ("humidity".equals(sName)){
currentWeather.humidity = parser.nextText();
}else if ("text".equals(sName)){
currentWeather.condition_text = parser.nextText();
}
}
break;
}

eventType = parser.next();
}

return printWeather(weather);
}

private String printWeather(ArrayList<WeatherConditions> weather){

StringBuilder builder = new StringBuilder();

for (WeatherConditions weatherC : weather){

builder.append(weatherC.name).append("\n").append(weatherC.wind_mph).append("\n").append(weatherC.wind_kph).append("\n").append(weatherC.celsius).append("\n").append(weatherC.feelsCelsius).
append("\n").append(weatherC.fahrenheit).append("\n").append(weatherC.feelsFahrenheit).append("\n").append(weatherC.humidity).append("\n").append(weatherC.condition_text).append("\n");

}

return builder.toString();
}


/// THIS METHOD ADDED
@Override
protected void onPostExecute(String result) {
txt.setText(result);
}
}

关于java - 我的 Android 天气应用程序出现奇怪的 "Only the original thread that created a view hierarchy can touch its views."错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59903115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com