Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >获取一个奇怪的“只有创建视图层次结构的原始线程才能接触到它的视图。”我的android天气应用程序出错

获取一个奇怪的“只有创建视图层次结构的原始线程才能接触到它的视图。”我的android天气应用程序出错
EN

Stack Overflow用户
提问于 2020-01-24 20:13:27
回答 1查看 57关注 0票数 1

我正在使用下面的代码来刷新手机显示屏上的天气信息,它在前2-3次工作得很好,但在那之后它开始崩溃,并给我这个错误。

代码如下:

代码语言:javascript
运行
AI代码解释
复制
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());
        }

    }

}

下面是错误输出:

代码语言:javascript
运行
AI代码解释
复制
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文件中的名称,崩溃开始并持续发生,即使在将代码恢复到原始状态之后也是如此。我也尝试过卸载和重新安装该应用程序,但都不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-24 21:19:39

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

代码语言:javascript
运行
AI代码解释
复制
    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);
        }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59903115

复制
相关文章
View视图的创建
在撸代码的过程中经常遇到创建 View 视图,创建视图有四种方式,但是这四种创建方式到底有什么不同呢?以前只知道能创建,但是不是这四种创建方式的区别,今天让我们一起去解析一下这几种创建方式。
CatEatFish
2020/07/09
1K0
View视图的创建
Android 各视图的大小
前言 常用高度 名称 值 状态栏高度 25dp ActionBar高度 48dp logo 名称 值 RATIO drawable-xxxhdpi 192×192 4x drawable-xxhdpi 144×144 3x drawable-xhdpi 96×96 2x drawable-hdpi 72×72 1.5x drawable-mdpi 48×48 1x 应用商店 512×512 ios常用的尺寸 ios常用的尺寸
码客说
2019/10/22
6960
MySQL/Oracle视图的创建与使用
视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。
互联网金融打杂
2018/08/02
1.4K0
MySQL视图的创建与使用
视图是MySQL的一种虚拟表,实际的表我们可以看到每一行的数据,而视图是另一种形式的表,他可以将任何的查询结果变成一种虚拟的表方便下一次进行查询。
大猫的Java笔记
2020/09/30
2.3K0
Android视图绑定ViewBinding的使用
首先感谢这位读者的提议,让我抽出时间细看视图绑定的内容,也打算在项目中使用该功能。当然,还有其他读者提议的内容我已记录,后期有时间也会陆续更新。话不多说,我们开始学习吧!
SoullessCoder
2021/09/07
2.7K0
iOS 中获取某个视图的截图
最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式。 我写了个UIView 的category,将这几种方式封装和简化了一下。
Haley_Wong
2018/08/22
3.1K0
Android视图绑定ViewBinding的使用
首先感谢这位读者的提议,让我抽出时间细看视图绑定的内容,也打算在项目中使用该功能。当然,还有其他读者提议的内容我已记录,后期有时间也会陆续更新。话不多说,我们开始学习吧!
SoullessCoder
2020/03/20
2.8K0
Android视图绑定ViewBinding的使用
视图的概念以及使用视图的好处
视图(View)是由Select查询语句定义的一个逻辑表,只有定义而无数据,是一个“**虚表**”。视图是查看和操作表中数据的一种方法。
徐建国
2021/08/03
1.8K0
关于创建视图的问题(48天)
今天开发碰到一个问题,说创建视图的时候老是提示没有权限。 SQL> create view test_view as select *from customer; create view test_view as select *from customer * ERROR at line 1: ORA-01031: insufficient privileges 第一反应是这个schema没有create view的权限。 查询发现有
jeanron100
2018/03/13
9110
揭开Android视图绘制的神秘面纱
在Android的UI中,View是至关重要的一个组件,它是用户界面的基本构建块。在View的绘制过程中,涉及到很多重要的概念和技术。本文将详细介绍Android View的绘制过程,让你能够更好地理解和掌握Android的UI开发。
Rouse
2023/08/31
2720
揭开Android视图绘制的神秘面纱
mysql创建索引视图_mysql中创建视图、索引[通俗易懂]
视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。
全栈程序员站长
2022/09/16
8.1K0
SpringMVC的视图
SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户
一个风轻云淡
2022/11/13
3800
SpringMVC的视图
【Android 逆向】IDA 工具使用 ( 十六进制视图 Hex View-1 | 结构体视图 Structures | 枚举视图 Enums | 导入视图 Import | 导出视图 )
Enums 中显示该动态库的枚举 , 该动态库中没有使用到枚举 , 这里是空的 ;
韩曙亮
2023/03/29
1.2K0
【Android 逆向】IDA 工具使用 ( 十六进制视图 Hex View-1 | 结构体视图 Structures | 枚举视图 Enums | 导入视图 Import | 导出视图 )
为什么SwiftUI的视图使用结构体?
如果您曾经为UIKit或AppKit(Apple的iOS和macOS原始用户界面框架)编程,您会知道它们使用类而非结构体来构造视图。SwiftUI并非如此:我们更喜欢将结构体用于整体视图,这有两个原因。
韦弦zhy
2020/03/26
3.3K0
为什么 SwiftUI 的视图使用结构体
如果您曾经为 UIKit 或 AppKit(Apple 的 iOS 和 macOS 原始用户界面框架)编程,您会知道它们使用类而非结构体来构造视图。SwiftUI 并非如此:我们更喜欢将结构体用于整体视图,这有两个原因。
Swift社区
2021/11/26
2.5K0
为什么 SwiftUI 的视图使用结构体
Android中的视图焦点Focus的详细介绍
在非触摸屏设备中接收事件和处理响应的控件是具有焦点(Focused)的控件。一个窗口中一个时间内只能有一个具有焦点的控件。在早期具有滚轮设备的android系统中以及现在的智能TV电视应用中视图的焦点控制就非常重要了。而在触摸设备上通常默认情况下只有EditText控件才具有焦点,而我们通常会遇到的一个问题就是当进入一个具有EditText的界面时键盘就会自动弹出,而且有时候可能无法消失,但需求可能是进入时不弹出键盘。而这些所有的东西都是和视图的焦点有关,因此本文的重点就是介绍视图的焦点属性和方法,get到这些技术点后你就可以完全控制和使用这些特性了。
欧阳大哥2013
2018/08/22
2.6K0
MYSQL的视图
MYSQL的视图 介绍 视图(view)是一个虚拟表,非真实存在,其本质是根据sql语句获取动态的数据集,并为其命名,用户使用时只需要使用视图名称即可获取结果集,并可以将其当做表来使用. 数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存档在原来的表中. 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据,因此,视图中的数据是依赖于原来的表中的数据,一旦表中的数据发生改变,显示在视图中的数据也会发生改变. 作用 简化代码,可以把重复使用的查询封装成视图重复使用,同时可以使复杂的查询易于
TimeFriends
2022/05/20
1.9K0
MYSQL的视图
ASP.NET Core 5.0 MVC中的视图分类及使用——布局视图、启动视图、导入视图、详细视图、分部视图
我们可以在这个页面,添加一些全局性的内容,比如全局变量等,然后在具体View页面使用这些变量值
明志德道
2023/10/21
5510
ASP.NET Core 5.0 MVC中的视图分类及使用——布局视图、启动视图、导入视图、详细视图、分部视图
在Swift中创建可缩放的图像视图
没有什么比完美的图片更能让你的应用程序熠熠生辉,但如果你想让你的应用程序用户真正参与并与图片互动呢?也许他们想放大、平移、掌握这些图像?
玖柒的小窝
2021/11/05
6.1K0
点击加载更多

相似问题

Android“只有创建视图层次结构的原始线程才能接触到它的视图。”

31410

Android只有创建视图层次结构的原始线程才能接触它的视图

22

Android:获取错误“只有创建视图层次结构的原始线程才能接触它的视图”

20

只有创建视图层次结构的原始线程才能在android中接触它的视图

10

Android:只有创建视图层次结构的原始线程才能接触它的视图-- UnitTest

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档