android.view.ViewRootImpl$CalledFromWrongThreadException错误处理

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

new Thread() {
@Override
public void run() {
 try {
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url .openConnection();
// 设置请求方式 connection.setRequestMethod("GET");
// 设置超时时间 connection.setConnectTimeout(10000);
int code = connection.getResponseCode();
if (code == 200) {
 InputStream is = connection.getInputStream();
 Bitmap bitmap = BitmapFactory.decodeStream(is);
 iv_beauty.setImageBitmap(bitmap); }
 else {
Toast.makeText(getApplicationContext(), "图片获取失败!", 0).show(); } }
 catch (Exception e) { Toast.makeText(getApplicationContext(), "图片获取失败!", 0) .show(); } } }.start();

如果是这样去操作,就会抛出

  10-20 02:50:38.219: W/System.err(497): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

后边那句英文的大概是说只有创建了UI对象的主线程才能去修改UI

  原因在于,在android里面不是线程安全的,所以android有阻止子线程更新组件的机制。

  于是我们应该将UI的更新交给主线程来完成,如何去完成,android为我们提供了一套消息处理机制。

  它大概的实现步骤是这样子的

  1.子线程利用Handler类发送一条消息,消息会被送完主线程的消息队列里

  2.主线程里边有一个叫looper的轮询器,它会循环遍历消息队列

  3.如果loopler发现消息队列里有新的消息,android就会调用Handler的handleMessage()方法来处理消息

本文转自:http://www.educity.cn/wenda/180403.html

时间: 2024-10-11 13:12:34

android.view.ViewRootImpl$CalledFromWrongThreadException错误处理的相关文章

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a vi

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views 这个错误相信大家一定不陌生,特别是刚学习android时,会引起的错误,意思是指在子线程中对UI做了操作,现在写个简单的demo: public class MainActivity extends Activity { privat

android异常:android.view.ViewRootImpl$CalledFromWrongThreadException

android异常:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 出现这个异常的原因是你在子线程中修改了主线程中的组件的状态或数据. android规定:只有在原始线程中(主线程,UI线程)才能修改显示组件.

android.view.ViewRoot$CalledFromWrongThreadException的解决办法

android 是不允许子线程直接更新UI的,如果一定要在子线程直接更新UI就会出现android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.大概意思就是说 只有原来创建找个视图hierarchy的线程才可以修改修改它. 我的解决办法是使用Activity.runOnUiThread(Runnabl

一、dialog.show()引起的android.view.WindowManager$BadTokenException错误

错误日志 ? 1 2 3 4 5 6 7 android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@427b7270 is not valid; is your activity running?     at android.view.ViewRootImpl.setView(ViewRootImpl.java:653)     at android.vi

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

1 runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub Log.i(tag, "will-success-update"); adapter.addItem((Will)reason); } }); Done

Android 编程:calledfromWrongThreadException 的原因

子线程更新UI会发生Android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法 子线程更新UI 显然假如你的程序需要执行耗时的操作的话,假如像上例一样由主线程来负责执行该操作是错误的.所以我们需要在onClick方法中创建一个新的子线程来负责调用GOOGLE API来获得天气数据.刚接触Android的开发者最轻易想到的方式就是如下: public void onClick(View v) { //创建一个子线程执行耗时的从网络上获得天

android 开发中遇到错误及解决办法总结

新手总结的开发中所遇到错误及解决办法,如有不对,欢迎指正,如有更好的解决办法,也请不吝赐教. 一.dialog.show()引起的android.view.WindowManager$BadTokenException错误 错误日志 android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?

[Android] 分析一个CalledFromWrongThreadException崩溃

1 问题描述 问题本身比较清晰简单,但推敲的过程中发现了不少有意思的东西. 在C++ SDK回调JNI至Java Observer函数中,直接操作了UI界面textView.setText(msg),第一次回调没有崩溃,第二次回调(或者退出Activity)时才会崩溃.奇怪不?崩溃栈信息如下: 07-02 16:04:07.503 32666 665 W ackor : [KLH]OnNotifyClick - 1 jenv=0x920544c0 07-02 16:04:07.503 32666

at android.view.LayoutInflater.createViewFromTag的错误原因

创建对话框时出现下面的错误: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference