zoukankan      html  css  js  c++  java
  • 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的方法时间变大

  • 相关阅读:
    Android游戏开发22:Android动画的实现J2me游戏类库用于Android开发
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第三部分,完整代码)
    使用OGR创建dxf格式矢量数据
    mysql 数据库引擎 MyISAM InnoDB 大比拼 区别
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)
    mysql 更改数据库引擎
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第一部分)
    android 数字键盘使用
    MySQL Innodb数据库性能实践
    eclipse : Error while performing database login with the driver null
  • 原文地址:https://www.cnblogs.com/kevincode/p/3892898.html
Copyright © 2011-2022 走看看