子线程创建Handler

首先,我们平时直接创建的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,越小优先级越高)

你可能感兴趣的:(Android)