• android异步更新UI界面的方法


    在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 plaincopy
     
     
    1. public class ExampleActivity extends Activity {  
    2.     Handler h = null;  
    3.     @override  
    4.     public void onCreate(Bundle savedinstancestate){  
    5.         h = new Handler(){  
    6.             @override  
    7.             public void handleMessage(Message msg){  
    8.                 // call update gui method.  
    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 plaincopy
     
    1. class Test implements Runnable  
    2.    {  
    3.     @Override  
    4.     public void run()   
    5.     {  
    6.         int len = 3;  
    7.         int i=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 (Exception e) {  
    17.                 e.printStackTrace();  
    18.             }  
    19.         }  
    20.     }  
    21.       
    22.    }  

    在主界面进行如下调用:

     MainActivity.this.runOnUiThread(test);

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

  • 相关阅读:
    linux中和salt中的fqdn测试小节
    centos7离线安装rpm包自动解决依赖
    (转)mysql创建表时反引号的作用
    mysql更新一个表里的字段等于另一个表某字段的值
    Navicat permium工具连接Oracle的配置
    IA64与x64的区别
    vsphere和vmware快照的不足之处
    mysql查看某库表大小
    sql之left join、right join、inner join的区别(转)
    读锁和写锁
  • 原文地址:https://www.cnblogs.com/kevincode/p/3892898.html
Copyright © 2020-2023  润新知