Android中我们不在子线程中操作UI,但是如果非要在子线程中操作完后实现对UI操作,这里的实现方法如下:
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() { // 子线程
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("ChangeUI", "Handler改变了ui");
message.setData(bundle);
handler.sendMessage(message);
}
}).start();
}
});
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
String str = bundle.getString("ChangeUI");
mUiTextview.setText(str);
}
};
runOnUiThread 就是为了更便捷的执行子线程时对ui进行操作
mButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() { // 子线程
runOnUiThread(new Runnable() {
@Override
public void run() {
mUiTextview.setText("runOnUiThread改变了ui");
}
});
}
}).start();
}
});
源码:
final Handler mHandler = new Handler();
private Thread mUiThread;
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程。