HandlerThread特點(diǎn):
1,與Thread類似煤杀,畢竟繼承至Thread眷蜈;
2,HandlerThread將loop轉(zhuǎn)到子線程中處理沈自,說白了就是將分擔(dān)MainLooper的工作量酌儒,降低了主線程的壓力,使主界面更流暢枯途。
3忌怎,開啟一個(gè)線程起到多個(gè)線程的作用。處理任務(wù)是串行執(zhí)行酪夷,按消息發(fā)送順序進(jìn)行處理榴啸。HandlerThread本質(zhì)是一個(gè)線程,在線程內(nèi)部晚岭,代碼是串行處理的鸥印。
4,但是由于每一個(gè)任務(wù)都將以隊(duì)列的方式逐個(gè)被執(zhí)行到,一旦隊(duì)列中有某個(gè)任務(wù)執(zhí)行時(shí)間過長辅甥,那么就會(huì)導(dǎo)致后續(xù)的任務(wù)都會(huì)被延遲處理酝润。
5,HandlerThread擁有自己的消息隊(duì)列璃弄,它不會(huì)干擾或阻塞UI線程要销。
6,對(duì)于網(wǎng)絡(luò)IO操作夏块,HandlerThread并不適合疏咐,因?yàn)樗挥幸粋€(gè)線程,還得排隊(duì)一個(gè)一個(gè)等著脐供。
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);
}
}
};
}
// 模擬從服務(wù)器解析數(shù)據(jù)
private void checkForUpdate() {
try {
//模擬耗時(shí)
Thread.sleep(1000);
mHandler.post(new Runnable() {
@Override
public void run() {
String result = "當(dāng)前幸運(yùn)指數(shù):<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()--- ");
}
}