在android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示。但是,在主线线程之外的线程中直接更新页面显示的问题是:系统会报这个异常,android.view.viewroot$calledfromwrongthreadexception: only the original thread that created a view hierarchy can touch its views. (只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)。)。

  也就是说必须在程序的主线程(也就是ui线程)中进行更新界面显示的工作。可以采用下面的方法之一来解决:

解决方案1:在activity.oncreate(bundle savedinstancestate)中创建一个handler类的实例, 在这个handler实例的handlemessage回调函数中调用更新界面显示的函数。例如:

  

[java] view plain copy
  1. publicclassExampleActivityextendsActivity{
  2. Handlerh=null;
  3. @override
  4. publicvoidonCreate(Bundlesavedinstancestate){
  5. h=newHandler(){
  6. @override
  7. publicvoidhandleMessage(Messagemsg){
  8. //callupdateguimethod.
  9. }
  10. };
  11. }
  12. }



  在其它的函数中,利用 send族或post族函数向这个h发送或邮寄消息即可。

解决方案2:利用activity.runonuithread(runnable)

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

注意,在这个地方的runnable其实不是动态的更新,如果在oncreate中使用这个方法,那么界面不会显出出来,因为需要等待runnable的方法调用完成之后,才可以进行显示界面。所以通过初始化界面来获得网络数据的情况,直接使用这个方法不可取。。。

如下:

[java] view plain copy
  1. classTestimplementsRunnable
  2. {
  3. @Override
  4. publicvoidrun()
  5. {
  6. intlen=3;
  7. inti=0;
  8. while(i<len)
  9. {
  10. System.out.println("ljz");
  11. i++;
  12. textView.setText("Hello|"+System.currentTimeMillis());
  13. textView.invalidate();
  14. try{
  15. Thread.sleep(1000);
  16. }catch(Exceptione){
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. }

在主界面进行如下调用:

MainActivity.this.runOnUiThread(test);

这样的结果就是创建oncreate的方法时间变大

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android游戏中动画的实现 .
  3. Android界面开发之样式定义(Defining Styles)
  4. Android(安卓)SDK 下载目录文件夹意义详解
  5. 仿微信-界面动画(5)ViewPager详解
  6. 准备☞Android(安卓)异步消息分发机制
  7. 深入源码分析Handler 消息机制 、Looper、MessageQueue 消息同步
  8. Android利用activity-alias动态更新图标icon,标题label
  9. Android开发之Android开发规范

随机推荐

  1. Android(安卓)TextView属性详解
  2. [置顶] android调用第三方库——第四篇—
  3. android 控件位置常用布局
  4. 修改android 睡眠的时间的两种方法
  5. Android(安卓)模拟器
  6. android之inputType属性
  7. android SDK2.3 更新改动翻译
  8. Android开发你需要具备的基本功
  9. Android中对Log日志文件的分析
  10. Android(安卓)Studio 网络调试