Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 615|回复: 0

Android异常:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-6 02:04:30 | 显示全部楼层 |阅读模式

    Android异常:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    出现这个异常的原因是你在子线程中修改了主线程中的组件的状态或数据。.翻译过来就是:只有创建这个控件的线程才能去更新该控件的内容。

    android规定:只有在原始线程中(主线程,UI线程)才能修改显示组件。

    解决方案:1、使用Handler机制。2、使用AsyncTask

    方案1概述:handler机制

    如下就是handler的简单工作原理图:


    既然android给我们提供了Handler机制来解决这样的问题,请看如下代码:

    class MyOnclickListener implements OnClickListener {
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		// 响应Handler异步方式
    		case R.id.downbtn1:
    			// 显示进度对话框,这里也可以使用进度条,在handleMessage方法中更新进度
    			dialog = ProgressDialog.show(DownLoadImageActivity.this, "",
    					"正在下载,请稍等···");
    			// 新建一个子线程来发送消息
    			new Thread() {
    				@Override
    				public void run() {
    					try {
    						// 让ProgressDialog显示一会儿。。。。
    						Thread.sleep(2000);
    						URL url = new URL(PATH);
    						// 建立网络连接
    						HttpURLConnection conn = (HttpURLConnection) url
    								.openConnection();
    						InputStream inputStream = conn.getInputStream();
    						// 获取图片数据
    						bitmap = BitmapFactory.decodeStream(inputStream);
    						inputStream.close();
    						Message message = new Message();
    						message.what = 1;
    						// 发送消息到消息队列中
    						handler.sendMessage(message);
    					} catch (Exception e) {
    						Message message = new Message();
    						message.what = -1;
    						handler.sendMessage(message);
    						e.printStackTrace();
    					}
    				}
    			}.start();
    			break;
    		// 响应AsyncTask异步方式
    		case R.id.downbtn2:
    			new DownImageTask().execute(PATH);
    			break;
    		}
    	}
    }
    
    // Handler异步方式下载图片
    private Handler handler = new Handler() {
    	public void handleMessage(android.os.Message msg) {
    		ImageView imageView;
    		switch (msg.what) {
    		case 1:
    			// 下载成功
    			imageView = (ImageView) findViewById(R.id.image);
    			dialog.dismiss();
    			imageView.setImageBitmap(bitmap);
    			break;
    		case -1:
    			// 下载失败使用默认图片
    			imageView = (ImageView) findViewById(R.id.image);
    			dialog.dismiss();
    			imageView.setBackgroundResource(R.drawable.icon);
    			break;
    		}
    	};
    };


            我们就通过Handler机制来处理了子线程去更新UI线程控件问题,Andrid开发中要经常用到这种机制。
    方式2以后再做介绍。


    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-11 23:03 , Processed in 0.056446 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表