androidUI界面的更新方法

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);
            }
        });
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值