美文网首页
HandlerThread应用

HandlerThread应用

作者: 自然之秋 | 来源:发表于2017-10-12 11:39 被阅读15次

    HandlerThread特点:
    1,与Thread类似,毕竟继承至Thread;
    2,HandlerThread将loop转到子线程中处理,说白了就是将分担MainLooper的工作量,降低了主线程的压力,使主界面更流畅。
    3,开启一个线程起到多个线程的作用。处理任务是串行执行,按消息发送顺序进行处理。HandlerThread本质是一个线程,在线程内部,代码是串行处理的。
    4,但是由于每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。
    5,HandlerThread拥有自己的消息队列,它不会干扰或阻塞UI线程。

    6,对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着。

    public class MainActivity extends AppCompatActivity {

    private String TAG = "MAinActivity";
    
    private TextView tvText;
    
    private Handler mHandler = new Handler();
    private boolean is_startCheck = false;
    private int START_CHECK = 10001;
    private HandlerThread mMainMsgThread;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        tvText = (TextView) findViewById(R.id.id_textview);
    
        initBackThread();
    }
    
    @Override
    protected void onResume() {
        super.onResume();
    
        is_startCheck = true;
    
        if (mHandler != null)
            mHandler.sendEmptyMessage(START_CHECK);
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        is_startCheck = false;
        if (mHandler != null)
            mHandler.removeCallbacksAndMessages(null);
    }
    
    private void initBackThread() {
    
        mMainMsgThread = new HandlerThread("MainActiivity");
    
        mMainMsgThread.start();
    
        mHandler = new Handler(mMainMsgThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
    
                checkForUpdate();
    
                if (is_startCheck) {
                    mHandler.sendEmptyMessageDelayed(START_CHECK, 1000);
                }
            }
        };
    
    }
    
    
    // 模拟从服务器解析数据
    private void checkForUpdate() {
        try {
            //模拟耗时
            Thread.sleep(1000);
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    String result = "当前幸运指数:<font color='red'>%d</font>";
                    result = String.format(result, (int) (Math.random() * 3000 + 1000));
    
                    final String finalResult = result;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            tvText.setText(Html.fromHtml(finalResult));
                        }
                    });
    
                }
            });
    
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //释放资源
        mMainMsgThread.quit();
    
        Log.e(TAG, " ---onDestroy()--- ");
    }
    

    }

    相关文章

      网友评论

          本文标题:HandlerThread应用

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