你的位置:首页 > 操作系统

[操作系统]更新UI的几种方式


      在学习Handler的过程中牵涉到UI的更新,在这里就总结一下更新UI的四种方式吧,用法都比较简单,直接看代码就可以了。

 

一、使用Handler的post方法

      新建项目,修改MainActivity代码,如下:

 1 package com.example.handldertest; 2  3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.widget.TextView; 7  8 public class UpdateUIActivity extends Activity{ 9   10 11   private TextView tv;12   private Handler handler = new Handler();13   protected void onCreate(Bundle savedInstanceState) {14     super.onCreate(savedInstanceState);15     tv = new TextView(this);16     tv.setText("你好");17     setContentView(tv);18     19     handler.post(new Runnable(){20       @Override21       public void run() {22         tv.setText("handler post");23       }24     });25   }26 27 }

      我们可以看到,如果不改变tv显示的文本信息,那么它应该显示”你好“两个字。但是我们使用了handler的post方法,这样子运行程序,就会将文本改为”handler post"。比较简单,我就不贴图了。

二、使用Handler的sendMessage方法

      修改MainActivity的代码如下:

 1 package com.example.handldertest; 2  3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.widget.TextView; 7  8 public class UpdateUIActivity extends Activity{ 9   10 11   private TextView tv;12   private Handler handler = new Handler(){13     public void handleMessage(android.os.Message msg) {14       tv.setText("handler msg");15     };16   };17   protected void onCreate(Bundle savedInstanceState) {18     super.onCreate(savedInstanceState);19     tv = new TextView(this);20     tv.setText("你好");21     setContentView(tv);22     23     handler.sendEmptyMessage(1);24   }25 26 }

        运行程序,发现文本信息被改为“handler msg"。

三、使用runOnUiThread

      Activity类提供了一个final类型的方法,即runOnUiThread,参数就是一个Runnable。这样子可以通过它来更新UI。修改MainActivity,如下:

 1 package com.example.handldertest; 2  3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.widget.TextView; 7  8 public class UpdateUIActivity extends Activity{ 9   10 11   private TextView tv;12   13   protected void onCreate(Bundle savedInstanceState) {14     super.onCreate(savedInstanceState);15     tv = new TextView(this);16     tv.setText("你好");17     setContentView(tv);18     19     runOnUiThread(new Runnable(){20       @Override21       public void run() {22         tv.setText("runOnUiThread");23         24       }25     });26     27   }28 29 }

       运行程序,发现文本信息被改成”runUiThread"。

四、view.post方法

      每一个view都有自己的post方法,其参数就是一个Runnable对象。在这里也可以进行更新UI的操作,修改MainActivity代码如下:

 1 package com.example.handldertest; 2  3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.widget.TextView; 7  8 public class UpdateUIActivity extends Activity{ 9   10 11   private TextView tv;12   13   protected void onCreate(Bundle savedInstanceState) {14     super.onCreate(savedInstanceState);15     tv = new TextView(this);16     tv.setText("你好");17     setContentView(tv);18     19     tv.post(new Runnable(){20     public void run() {21       tv.setText("tvpost");22      };23     });24     25   }26 27 }

       运行程序,发现文本信息被改为“tvpost"。

       在这里我插一句,你可以想象成view的post是在view被绘制完成后被自动调用。因此我们可以在这个方法中获得view的宽和高等执行一个其他的逻辑。因为在onCreate方法中直接获得tv的宽和高,肯定为0值,此时tv还没被画出来呢。

 

       好了,以上即是四种常用的更新UI的方式,其实如果你翻看源代码,你就会发现每一种的原理都是基于第二种方式,即Handler发送消息来更新。只不过它们都做了相应的封装而已。