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的方法时间变大

  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/kevincode/p/3892898.html
Copyright © 2011-2022 走看看