Android 在其他线程中更新UI线程的解决方法

1 用Activity对象的runOnUiThread方法更新

new Thread() {  
    public void run() {  
        //这儿是耗时操作,完成之后更新UI;  
        runOnUiThread(new Runnable(){  
        @Override  
            public void run() {  
                //更新UI  
                imageView.setImageBitmap(bitmap);  
            }  
        });  
    }  
}.start();  

2子线程调用Handler的sendMessage(message)发送消息

//主线程中定义Handler
Handler mHandler = new Handler() {  
    @Override  
    public void handleMessage(Message msg) {  
        super.handleMessage(msg);  
        switch (msg.what) {  
            case 0:  
            //完成主界面更新,拿到数据  
                String data = (String)msg.obj;  

                updateWeather();  
                textView.setText(data);  
                break;  
            default:  
                break;  
        }  
    }  
};  
//子线程发消息,通知Handler完成UI更新
private void updateWeather() {  
    new Thread(new Runnable(){  
        @Override  
        public void run() {  
            //耗时操作,完成之后发送消息给Handler,完成UI更新;  
            mHandler.sendEmptyMessage(0);  
            //需要数据传递,用下面方法;  
            Message msg =new Message();  
            msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;  
            mHandler.sendMessage(msg);  
        }  
    }).start();  
}  

3 View.post(Runnable )

imageView.post(new Runnable(){  
    @Override  
    public void run() {  
        //更新ui
        imageView.setImageBitmap(bitmap);  
    }  
});  

4 AsyncTask

总结
1.如果只是单纯的想要更新UI而不涉及到多线程的话,使用View.post()就可以了;
2.需要另开线程处理数据以免阻塞UI线程,像是IO操作或者是循环,可以使用Activity.runOnUiThread();
3.如果需要传递状态值等信息,像是蓝牙编程中的socket连接,就需要利用状态值来提示连接状态以及做相应的处理,就需要使用Handler + Thread的方式;
4.如果是后台任务,像是下载任务等,就需要使用AsyncTask。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值