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

Android异常:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original的更多相关文章

  1. [Android]异常8-android.view.WindowManager$BadTokenException

    背景:Service服务中使用WindowManager时,Android4.4使用正常,Android6.0使用应用崩溃停止运行,提示android.view.WindowManager$BadTo ...

  2. Android 异常 android.os.NetworkOnMainThreadException

    近期在实现一个Android下的数据採集的SDK,收集用户使用数据使用HTTP发送到云平台.进行数据分析.但在发送数据时报例如以下错误: Caused by: android.os.NetworkOn ...

  3. 发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案

    在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是 报异常:android.vie ...

  4. android.view.ViewRootImpl$CalledFromWrongThreadException错误处理

    一般情况下,我们在编写android代码的时候,我们会将一些耗时的操作,比如网络访问.磁盘访问放到一个子线程中来执行.而这类操作往往伴随着UI的更新操作.比如说,访问网络加载一张图片 new Thre ...

  5. ViewPager空指针错误,android.support.v4.view.ViewPager.onSaveInstanceState

    support.v4 包为我们提供了一个非常实用的滑动控件ViewPager,在使用ViewPager时有一个需要注意的地方: 即: android.support.v4.view.ViewPager ...

  6. Android异常分析(转)

    关于异常 异常? 异常就是一种程序中没有预料到的问题,既然是没有预料到的,就可能不在原有逻辑处理范围内,脱离了代码控制,软件可能会出现各种奇怪的现象.比如:android系统常见异常现象有应用无响应. ...

  7. android 异常信息The specified child already has a parent. You must call removeView() on the child's parent first. 的处理方法

    [Android异常信息]: The specified child already has a parent. You must call removeView() on the child's p ...

  8. Android 异常解决方法【汇总】

    (1)异常:Android中引入第三方Jar包的方法(Java.lang.NoClassDefFoundError解决办法) 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方 ...

  9. Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)

    Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect) [TOC] 这两个方法的区别 View.ge ...

随机推荐

  1. bzoj2005 NOI2010 方案统计

    2005: [Noi2010]能量采集 Time Limit: 10 Sec  Memory Limit: 552 MBSubmit: 4387  Solved: 2619[Submit][Statu ...

  2. 用js来实现那些数据结构11(字典)

    我们这篇文章来说说Map这种数据结构如何用js来实现,其实它和集合(Set)极为类似,只不过Map是[键,值]的形式存储元素,通过键来查询值,Map用于保存具有映射关系的数据,Map里保存着两组数据: ...

  3. 配置mysql使其允许外部ip进行登录

    这两天在做一个数据库的项目,用到了mysql,需要通过外部的ip远程访问mysql,发现默认的mysql是不允许远程访问的,需要做简单的配置. 如下: 1. 打开一个终端(cmd)输入 mysql - ...

  4. Python类的定义

    Python笔记--类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  5. django之模板显示静态文件

    由于django的模板渲染机制,图片不能直接引用,否则不会显示. <img src="/static/img/logo.jpg"> 可以看出图片的大小轮廓,但并不显示内 ...

  6. web.xml is missing and <failOnMissingWebXml> is set to true

    这时候需要右击项目-->Java EE Tools-->Generate Deployment Descriptor Stub .然后系统会在src/main/webapp/WEB_INF ...

  7. 前端实现搜索历史和清空历史(angularjs+ionic)

    要实现的页面效果: 1.显示历史搜索, 2.最近搜索的排在最前, 2.最多显示8条历史 4.清空历史记录 思路: 1.首先显示历史记录需要一个数组searchItems,通过ng-repeat显示每一 ...

  8. JavaScript 题目(作用域)

    var length = 10 function fn(){ alert(this.length) } var obj = { length: 5, method: function(fn) { fn ...

  9. 未能加载 global.asax的类的解决方案

    “/suitecallback”应用程序中的服务器错误. 分析器错误 说明: 在分析向此请求提供服务所需资源时出错.请检查下列特定分析错误详细信息并适当地修改源文件. 分析器错误消息: 未能加载类型“ ...

  10. 开源Spring解决方案--lm.solution

    Github 项目地址: https://github.com/liumeng0403/lm.solution 一.说明 1.本项目未按java项目传统命名方式命名项目名,包名 如:org.xxxx. ...