HandlerThread

1.产生背景

开启Thread子线程进行耗时操作;

多次创建和销毁线程是很消耗系统资源的;

2.什么是HandlerThread

handle+thread+looper  是一个thread内部有looper

3.HandlerThread的特点

1)本质上是一个线程类,继承Thread

2)有自己的内部Looper对象,可以进行looper循环

3)通过获取HandlerThread的looper对象传递给Handler对象,可以在handleMessage方法中执行异步任务

4)优点是不会堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理,处理效率低

5)与线程池注重并发不同,HandlerThread是一个串行队列,HandlerThread背后只有一个线程。


HandlerThread实例

    public class MainActivity extends AppCompatActivity {

    private TextView mTvServiceInfo;

    private HandlerThread mCheckMsgThread;

    private Handler mCheckMsgHandler;

    private boolean isUpdateInfo;

    private static final int MSG_UPDATE_INFO = 0x110;


    private Handler mHandler = new Handler();

@Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mTvServiceInfo = (TextView) findViewById(R.id.id_textview);


        //创建后台线程

        initBackThread();

    }

@Override

    protected void onResume() {

        super.onResume();

        //开始查询

        isUpdateInfo = true;

        mCheckMsgHandler.sendEmptyMessage(MSG_UPDATE_INFO);

    }

 @Override

    protected void onPause() {

        super.onPause();

        //停止查询

        isUpdateInfo = false;

        mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO);

    }

 @Override

    protected void onDestroy() {

        super.onDestroy();

        //释放资源

        mCheckMsgThread.quit();

    }



    private void initBackThread() {

        mCheckMsgThread = new HandlerThread("check-message-coming");

 mCheckMsgThread.start();

        mCheckMsgHandler = new Handler(mCheckMsgThread.getLooper()){

            @Override

            public void handleMessage(Message msg) {

                checkForUpdata();

                if (isUpdateInfo){

mCheckMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO,1000);

                }

            }

        };


    }



    //模拟从服务器解析数据

    private void checkForUpdata(){

        try {

 //模拟耗时

            Thread.sleep(1000);

            mHandler.post(new Runnable() {

                @Override

                public void run() {

                    String result = "实时更新中,当前大盘指数:%d";

                    result = String.format(result,(int)(Math.random()*3000+1000));

 mTvServiceInfo.setText(Html.fromHtml(result));

                }

            });

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}

你可能感兴趣的:(HandlerThread)