在学习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             @Override
21             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             @Override
21             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发送消息来更新。只不过它们都做了相应的封装而已。

 

posted on 2015-10-18 20:00  fuly  阅读(829)  评论(1编辑  收藏  举报