在学习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发送消息来更新。只不过它们都做了相应的封装而已。
原标题:更新UI的几种方式
关键词: