android 线程控制ui,Android 子线程中进行UI操作(非发送消息)

除了发送消息之外,我们还有以下几种方法可以在子线程中进行UI操作:

1. Handler的post()方法

public boolean post(Runnable action) {

Handler handler;

if (mAttachInfo != null) {

handler = mAttachInfo.mHandler;

} else {

ViewRoot.getRunQueue().post(action);

return true;

}

return handler.post(action);

}

public final boolean post(Runnable r)  {

return  sendMessageDelayed(getPostMessage(r), 0);

}

原来这里还是调用了sendMessageDelayed()方法去发送一条消息啊,并且还使用了getPostMessage()方法将Runnable对象转换成了一条消息,我们来看下这个方法的源码:

private final Message getPostMessage(Runnable r) {

Message m = Message.obtain();

m.callback = r;

return m;

}

在这个方法中将消息的callback字段的值指定为传入的Runnable对象。咦?这个callback字段看起来有些眼熟啊,喔!在Handler的dispatchMessage()方法中原来有做一个检查,如果Message的callback等于null才会去调用handleMessage()方法,否则就调用handleCallback()方法。那我们快来看下handleCallback()方法中的代码吧:

private final void handleCallback(Message message) {

message.callback.run();

}

很简单,就是直接调用了一开始传入的Runnable对象的run()方法。

因此在子线程中通过Handler的post()方法进行UI操作就可以这么写:

public class MainActivity extends Activity {

private Handler handler;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

handler = new Handler();

new Thread(new Runnable() {

@Override

public void run() {

handler.post(new Runnable() {

@Override

public void run() {

// 在这里进行UI操作

}

});

}

}).start();

}

}

虽然写法上相差很多,但是原理是完全一样的,我们在Runnable对象的run()方法里更新UI,效果完全等同于在handleMessage()方法中更新UI。

2. View的post()方法,就是调用了Handler中的post()方法

public boolean post(Runnable action) {

Handler handler;

if (mAttachInfo != null) {

handler = mAttachInfo.mHandler;

} else {

ViewRoot.getRunQueue().post(action);

return true;

}

return handler.post(action);

}

3. Activity的runOnUiThread()方法

如果当前的线程不等于UI线程(主线程),就去调用Handler的post()方法,否则就直接调用Runnable对象的run()方法。

public final void runOnUiThread(Runnable action) {

if (Thread.currentThread() != mUiThread) {

mHandler.post(action);

} else {

action.run();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值