首先,我们平时直接创建的Handler实例默认是在主线程,是可以直接更新UI操作,而在子线程创建的Handler则不可以直接更新UI操作(可以通过runUIThread(Runnable run)切换到主线程),下面介绍两种在子线程创建Handler的方式:
一、基本方式
private Handler mHandler; //创建子线程handler private void createHandler(){ new Thread(new Runnable() { @Override public void run() { Looper.prepare(); mHandler = new Handler(Looper.myLooper());//传入子线程Looper Looper.loop(); } }).start(); } //推送任务到消息队列 private void postRun(){ mHandler.post(new Runnable() { @Override public void run() { //执行耗时操作 SystemClock.sleep(5000); //更新UI MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { actTextReslt.setText("完成操作"); } }); } }); }
二、HandlerThread方式(HandlerThread内部创建消息队列,外部通过handler通知HandlerThread执行)
private Handler mHandler; //创建子线程handler private void createHandler(){ HandlerThread handlerThread = new HandlerThread("myHandlerThread", Process.THREAD_PRIORITY_BACKGROUND); handlerThread.start();//必须开启 mHandler = new Handler(handlerThread.getLooper()); } //推送任务到消息队列 private void postRun(){ mHandler.post(new Runnable() { @Override public void run() { //执行耗时操作 SystemClock.sleep(5000); //更新UI MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { actTextReslt.setText("完成操作"); } }); } }); }总结:方式二是Android对方式一的封装,使用起来更简单。其中HandlerThread构造方法的第二个参数表示优先级(范围-20~19,越小优先级越高)