androidUI界面的更新方法
学习android的过程中积累了几个子线程更新UI界面的方法,在这里记录一下,加强下记忆,也和大家分享一下,或许有的童鞋也需要.
- handler.post();
- handler.sendMessage();
- runOnUiThread();
- view.post();
一 方法
1. handler.post(Runnable r);
private Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
iv.setImageResource(R.drawable.rain);
}
});
还可以用handler.postDelayed(Runnable r, long delayMillis);
其中delayMillis参数为延迟时间,单位是毫秒
2.handler.sendMessage(Message msg);
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
iv.setImageResource(R.drawable.rain);
};
};
handler.sendEmptyMessage(1);
同样可以设置延迟发送,可以使用handler.sendMessageDelayed(Message msg, long delayMillis);
msg参数可以传值,可以通过arg1,arg2,what传递int类型的值,也可以通过obj传递Object类型的值;
delayMillis参数为延迟时间,单位是毫秒.
3.runOnUiThread(Runnable action);
runOnUiThread(new Runnable() {
@Override
public void run() {
iv.setImageResource(R.drawable.rain);
}
});
在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行动作。如果当前线程不是UI线程,则操作将被发布到UI线程的事件队列。
4.view.post(Runnable action);
iv.post(new Runnable() {
@Override
public void run() {
iv.setImageResource(R.drawable.rain);
}
});
View类提供的post方法,将Runnable添加到消息队列
二 例子
下面以更新ImageView为例写一个更新UI界面的小例子
首先布局文件,内容十分简单,只有一个ImageView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
</RelativeLayout>
java文件中包含更新UI界面的4种方法,分别写成了4个函数
public class UpdateUI extends Activity {
private ImageView iv;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
iv.setImageResource(R.drawable.rain);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_ui);
iv = (ImageView) findViewById(R.id.iv);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//update1();
//update2();
//update3();
//update4();
}
}).start();
}
/**
* 方法1:handler.post();
*/
public void update1(){
handler.post(new Runnable() {
@Override
public void run() {
iv.setImageResource(R.drawable.rain);
}
});
}
/**
* 方法2:handler.sendMessage();
*/
public void update2(){
handler.sendEmptyMessage(1);
}
/**
* 方法3:runOnUiThread();
*/
public void update3(){
runOnUiThread(new Runnable() {
@Override
public void run() {
iv.setImageResource(R.drawable.rain);
}
});
}
/**
* iv.post();
*/
public void update4(){
iv.post(new Runnable() {
@Override
public void run() {
iv.setImageResource(R.drawable.rain);
}
});
}
}