zoukankan      html  css  js  c++  java
  • 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以后再做介绍。


  • 相关阅读:
    Json对象与Json字符串互转(4种转换方式)
    Web.config配置文件详解
    jQuery BlockUI Plugin Demo 6(Options)
    jQuery BlockUI Plugin Demo 5(Simple Modal Dialog Example)
    jQuery BlockUI Plugin Demo 4(Element Blocking Examples)
    jQuery BlockUI Plugin Demo 3(Page Blocking Examples)
    jQuery BlockUI Plugin Demo 2
    <configSections> 位置引起的错误
    关于jQuery的cookies插件2.2.0版设置过期时间的说明
    jQuery插件—获取URL参数
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299672.html
Copyright © 2011-2022 走看看