- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用以下代码刷新手机显示屏上的天气信息,前 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/
XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allow
Git diff 似乎在比较时返回不同的变化: git diff origin/master ... origin/branch git diff origin/master...origin/bra
我正在研究 3.1 Git Branching - Branches in a Nutshell 中的 git 分支概念 我正在玩虚拟存储库。 git log --oneline --decorate
我知道有很多类似的问题,唯一的区别是我从 **same ** 域提供的两个页面得到了这个。这可以在下面的示例中看到。 Uncaught DOMException: Blocked a fram
我被要求使用 Fork Workflow,即我必须处理具有相同或相似名称的多个分支。我为什么要使用这些不同的变体? 以下是不同命名约定的一些示例: 我的分支机构 起源我的分支 起源/我的分支机构 远程
这个问题已经有答案了: How do I delete a Git branch locally and remotely? (41 个回答) 已关闭 9 年前。 好的,我已经创建了一个 origin
这是我关于如何让 lerna 在 Jenkins 中运行的一系列问题的一部分。 上一期: lerna publish on Jenkins "git remote update" Fails "Cou
当我尝试从我的 Angular 6 应用程序访问 Webhdfs 时,我收到如下所示的错误。在我看来,我几乎尝试了所有方法,包括更改 core-site.xml 和 hdfs-site.xml 中的设
我正在从不同的来源向我的服务器发出 Ajax POST 请求以供用户登录。我已经在我的 application_controller.rb 中正确设置了 Cross Origin header : d
我刚刚克隆了一个存储库并在 Git 中开始了一个新分支。我已经这样做了很多次而没有遇到问题。今晚当我尝试使用 git branch --set-upstream develop origin/deve
我对 Git 还很陌生,但仍在掌握它的窍门。我最近才开始使用分支机构,遇到了一些问题。 我有两个开发系统,一个 Ubuntu 桌面和一个 MacBookPro。我在 Ubuntu 系统上的一个新的 o
这个问题在这里已经有了答案: Why does "git push main" work on GitHub when "git push master" does not? Also what i
我想从我的应用访问一个 API。 curl 请求是: curl --request POST https://... --header 'Authorization: Token ...'
我试图理解的遗留 makefile 具有 -Wl,-z,origin,-rpath,'$ORIGIN/../lib' 好的,我看到 -Wl 表示以下是链接器选项;逗号将替换为空格。 GNU ld 的联
我正在寻找 OpenShift Origin 和 OpenShift Enterprise 之间的主要区别。我知道第一个是开源的,后者是商业版。与开源版本相比,OpenShift Enterprise
我在 Sourcetree 中有这个历史图表: Sourcetree graph 如何将最后一次提交从 origin/development 复制到 origin/master 分支? 第二个问题:图
运行 git 命令时空格和斜杠有什么区别? 我有时会看到 git push origin master(这是一个空格) 还有其他时候我看到 git rebase origin/master(使用斜杠)
根据文档,git pull 执行 git fetch 然后执行 git merge,但是在那种情况下执行 git pull origin master 应该执行 git fetch origin ma
我正在使用我的 git 存储库,并在早些时候对 master 分支进行了相当多的提交。现在我意识到它有点太吵了,我想将所有这些 merge 到一个提交中。 102381 commit z .... 1
我制作了一个小的 xslt 文件来创建一个名为 weather.xsl 的 html 输出,代码如下: 我想将 html 输出加载到 html 文件中的 div 中,我正在尝试
我是一名优秀的程序员,十分优秀!