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. Windows Azure Storage (18) 使用HTML5 Portal的Azure CDN服务
  2. Unit Test测试框架中的测试的执行顺序
  3. Boba.js – 用于 Google 统计分析 JavaScript 库
  4. Java内存泄露的理解与解决
  5. 移动web调式利器---Rosin研究
  6. UWP textbox 只能输入数字
  7. 那些年被我坑过的Python——你来我往(第九章 selectors)
  8. java 判断对象是否是某个类的类型方法
  9. C# 处理PPT水印(一)——添加水印效果(文字水印、图片水印)
  10. 『Numpy』np.meshgrid
  11. 链接服务器XXX的OLE DB提供程序“SQLNCLI”无法启动分布式事务“
  12. vue.js 中slot 用处大(转载)
  13. ExcelUtil工具类
  14. Java实现动态规划法求解0/1背包问题
  15. JavaScript里Math对象的ceil()、floor()、round()方法的区别
  16. jQuery Easyui Datagrid相同连续列合并扩展
  17. Python 学习笔记(九)Python元组和字典(三)
  18. #Leetcode# 700. Search in a Binary Search Tree
  19. [置顶] Android App引导页这些坑你自己犯过吗?
  20. CentOS 6.5添加网易163源

热门文章

  1. [Noi2016]优秀的拆分
  2. ORACLE 触发器 基础
  3. Android Activity的任务栈和四大启动模式
  4. python (3.5)字符串 持续更新中………………
  5. # C语言程序设计第一次作业1234
  6. Python爬取腾讯新闻首页所有新闻及评论
  7. IOI2016Day2. paint
  8. vmware迁移到openstack的一些坑
  9. find函数用法详解
  10. COCO 数据集的使用