美文网首页
handlerThread详解

handlerThread详解

作者: Skypew | 来源:发表于2017-12-04 15:30 被阅读35次
开启Thread子线程 进行耗时操作

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

一.handerThread 是什么

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

  • HandlerThread 本质上是一个线程类,它继承Thread;
  • HanderThread有自己的内部Looper对象,可以进行looper循环
  • 通过HanderThread的looper对象 传递给Hander对象 ,可以在handerMessage中进行异步任务(子线程中)
  • 优点是不会有堵塞,减少对性能的消耗,缺点是不能同时进行多任务处理,需要等待进行处理,处理效率较低
  • 与线程池注重并发不同,HanderThread 是一个串行队列,HanderThread 背后只有一个线程

public class HandlerThreadActivity extends AppCompatActivity {


    private TextView mTvServiceInfo;

    private HandlerThread mCheckMsgThread;

    private Handler mCheckMsgHandler;
    private boolean isUpdateInfo;

    //与UI线程管理的handler
    private Handler mHandler = new Handler();


    private static final int MSG_UPDATE_INFO = 0x110;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler_thread);


        //创建后台线程
        initBackThread();

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


    }



    @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);

    }



    private void initBackThread() {

        mCheckMsgThread = new HandlerThread("check-message");
        mCheckMsgThread.start();
        //子线程的looper 可执行异步任务
        mCheckMsgHandler = new Handler(mCheckMsgThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {

                checkForUpdate(); //子线程中执行
                if (isUpdateInfo) {
                    mCheckMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO, 1000);
                }
            }
        };

    }




    /**
     * 模拟从服务器解析数据
     */
    private void checkForUpdate() {
        try
        {
            //模拟耗时
            Thread.sleep(1000);
            //ui 线程的hander 
            mHandler.post(new Runnable() {
                @Override
                public void run() {

                    //Ui线程中执行 
                    String result = "实时更新中,当前大盘指数:<font color='red'>%d</font>";
                    result = String.format(result, (int) (Math.random() * 3000 + 1000));
                    mTvServiceInfo.setText(Html.fromHtml(result));
                }
            });

        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }

    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //释放资源
        mCheckMsgThread.quit();
    }
    

}

相关文章

网友评论

      本文标题:handlerThread详解

      本文链接:https://www.haomeiwen.com/subject/xnghvxtx.html