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

(只有创建了UI对象的主线程才能去修改UI)

解决方案一:

在 Android 不是线程安全的, Android 有阻止子线程更新 UI 的机制。在 Android 编程中,需要在主线程之外的一个单独的子线程中进行某些耗时操作,然后更新用户界面显示。但是,在主线程之外的线程中直接更新 UI 显示的问题是:系统会报这个异常,必须在程序的主线程(也就是 UI 线程)中进行更新界面显示的工作。于是我们应该将 UI 的更新交给主线程来完成,Android为我们提供了一套消息处理机制。

实现步骤:
  在 Activity 的 onCreate(Bundle savedinstancestate){} 中创建一个Handler类的实例 mHandler,在这个mHandler 实例的 handleMessage(msg) 方法的回调方法中调用更新界面显示的方法。例如:

public class ExampleActivity extends Activity {      Handler h = null;      @override      public void onCreate(Bundle savedinstancestate){          h = new Handler(){              @override              public void handleMessage(Message msg){                  // call update gui method.              }          };      }  }  

 在其它的函数中,利用 send族或post族函数向这个 mHandler 发送或邮寄消息即可。
 如果使用 Handler 后还是会报这个错,就 把 handleMessage(msg)改成sendMessage(msg) 试试。
 

解决方案二:

利用 activity.runOnUiThread(new Runnable(){}),把更新 UI 的代码创建在 runnable 中,然后在需要更新 UI 时,把这个 Runnable 对象传给 activity.runOnUiThread(runnable) 。 这样 runnable 对像就能在ui程序中被调用。

getActivity().runOnUiThread(new Runnable() {                    @Override                    public void run() {                    }                });

更多相关文章

  1. android一句话实现APP自动更新(带通知栏)
  2. Android五种Toast显示样式
  3. Android(安卓)SDK 在线更新镜像服务器资源
  4. android 2.3 webkit
  5. Android优秀开源项目
  6. Android实现多层级Spinner列表选项实时更新树形层级
  7. Android中的消息机制
  8. 史上最好用的Android全量版本更新库XUpdate使用指南
  9. Android热更新之so库的热更新

随机推荐

  1. Android核心模块及相关技术
  2. Android本地数据存储之Sharedpreference
  3. Android(安卓)Activity启动模式分析
  4. android中加载大图片到内存
  5. android keytool 不是内部命令或外部命令
  6. android_防止被反编译 混淆
  7. Android中activity的启动模式详解
  8. 解决 Android(安卓)模拟器 无法上网问题
  9. Android(安卓)设定横屏,禁止屏幕旋转,Activ
  10. Android根据文件路径使用File类获取文件