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


    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以后再做介绍。


  • 相关阅读:
    引自天天安全网 ——※ 中华民族传统文化精髓___二十四孝 ※
    Microsoft 技术与安全大会
    Linux的用户和用户组管理
    vsftpd设置与使用总结
    MySQL与NoSQL——SQL与NoSQL的融合
    linux下查看用户及用户组的方法
    软件系统开发中的数据交换协议
    Ubuntu实用简单的FTP架设
    淘宝网商品库优化实践访谈
    current attention url
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299672.html
Copyright © 2020-2023  润新知