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