HandlerThread应用

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 = "当前幸运指数:%d";
                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应用)