Android UI线程安全 runOnUiThread 和 Handler 一般用法
在非主线程里面操作UI,是非法的
所以有以下两个方法:
1. runOnUiThread
runOnUiThread(new Runnable() { @Override public void run() { } });
2. 用Handler:就关于Handler来说,有两个方式传递消息给UI。
//用法1: 直接用 new Message() public void Test1(){
new Thread(()->{ Message msg = new Message(); msg.what = 1; msg.arg1 = 101; msg.arg2 = 102; msg.obj = "Test1 message obj"; handler.sendMessage(msg); }).start(); }
// 用法2(推荐用这个):
public void Test2(){ new Thread(()->{ Message msg = handler.obtainMessage(); //不自己创建,耳塞从MessagePool 去拿 msg.what = 1000; msg.arg1 = 100001; msg.arg2 = 100002; msg.obj = "Test2 message obj"; handler.sendMessage(msg); }).start(); } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { System.out.println("msg what:" + msg.what); System.out.println("msg arg1:" + msg.arg1); System.out.println("msg arg2:" + msg.arg2); System.out.println("msg obj:" + msg.obj);
//此处属于线程安全,可以设置界面操作:如 txtmsg.setText("print from Handler"); } };