android使用handlerthread創(chuàng)建線程示例
在android開發(fā)中,一說起線程的使用,很多人馬上想到new Thread(){...}.start()這種方式。
這樣使用當(dāng)然可以,但是多次使用這種方式,會(huì)創(chuàng)建多個(gè)匿名線程。使得程序運(yùn)行起來越來越慢。
因此,可以考慮使用一個(gè)Handler來啟動(dòng)一個(gè)線程,當(dāng)該線程不再使用就刪除,保證線程不會(huì)重復(fù)創(chuàng)建。
一般會(huì)使用Handler handler = new Handler(){...}創(chuàng)建Handler。這樣創(chuàng)建的handler是在主線程即UI線程下的Handler,
即這個(gè)Handler是與UI線程下的默認(rèn)Looper綁定的。Looper是用于實(shí)現(xiàn)消息隊(duì)列和消息循環(huán)機(jī)制的。
因此,如果是默認(rèn)創(chuàng)建Handler那么如果線程是做一些耗時(shí)操作如網(wǎng)絡(luò)獲取數(shù)據(jù)等操作,這樣創(chuàng)建Handler是不行的。
Android API提供了HandlerThread來創(chuàng)建線程。官網(wǎng)的解釋是:Handy class for starting a new thread that has a looper.
The looper can then be used to create handler classes. Note that start() must still be called.
HandlerThread實(shí)際上就一個(gè)Thread,只不過它比普通的Thread多了一個(gè)Looper。
創(chuàng)建HandlerThread時(shí)要把它啟動(dòng)了,即調(diào)用start()方法。然后創(chuàng)建Handler時(shí)將HandlerThread中的looper對(duì)象傳入。
HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();
mHandler = new Handler(thread.getLooper());
mHandler.post(new Runnable(){...});
那么這個(gè)Handler對(duì)象就是與HandlerThread這個(gè)線程綁定了(這時(shí)就不再是與UI線程綁定了,這樣它處理耗時(shí)操作將不會(huì)阻塞UI)。 下面是代碼說明:
public class MainActivity extends Activity implements OnClickListener{
private Handler mHandler;
private HandlerThread mHandlerThread;
private boolean mRunning;
private Button btn;
@Override
protected void onDestroy() {
mRunning = false;
mHandler.removeCallbacks(mRunnable);
super.onDestroy();
}
@Override
protected void onResume() {
mRunning = true;
super.onResume();
}
@Override
protected void onStop() {
mRunning = false;
super.onStop();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
mHandlerThread = new HandlerThread("Test", 5);
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
}
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
while (mRunning) {
Log.d("MainActivity", "test HandlerThread...");
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.btn :
mHandler.post(mRunnable);
break;
default :
break;
}
}
}
相關(guān)文章
android使用Socket通信實(shí)現(xiàn)多人聊天應(yīng)用
這篇文章主要為大家詳細(xì)介紹了android使用Socket通信實(shí)現(xiàn)多人聊天應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Android實(shí)現(xiàn)梯形TextView效果
TextView(文本框),用于顯示文本的一個(gè)控件,Android開發(fā)中經(jīng)常使用,本文講述如何實(shí)現(xiàn)一個(gè)梯形的TextView2021-05-05Android中用RxJava和ViewPager實(shí)現(xiàn)輪播圖
現(xiàn)在App中實(shí)現(xiàn)一個(gè)輪播圖已經(jīng)是很多產(chǎn)品的標(biāo)配了,這篇文章給大家詳細(xì)介紹了如何利用RxJava和ViewPager實(shí)現(xiàn)輪播圖,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-09-09android 多點(diǎn)觸摸圖片縮放的具體實(shí)現(xiàn)方法
2013-06-06Android編程實(shí)現(xiàn)3D立體旋轉(zhuǎn)效果的實(shí)例代碼
這篇文章主要介紹了Android編程實(shí)現(xiàn)3D立體旋轉(zhuǎn)效果的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Kotlin結(jié)合Rxjava+Retrofit實(shí)現(xiàn)極簡網(wǎng)絡(luò)請(qǐng)求的方法
這篇文章主要給大家介紹了關(guān)于Kotlin結(jié)合Rxjava+Retrofit實(shí)現(xiàn)極簡網(wǎng)絡(luò)請(qǐng)求的相關(guān)內(nèi)容,文中分別對(duì)Rxjava和Retrofit進(jìn)行了簡單的介紹,然后通過示例代碼詳細(xì)介紹了如何實(shí)現(xiàn)極簡網(wǎng)絡(luò)請(qǐng)求,需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11Android?Canva實(shí)現(xiàn)漸變進(jìn)度條
這篇文章主要為大家介紹了Android?Canva實(shí)現(xiàn)漸變進(jìn)度條示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Android的WebView與H5前端JS代碼交互的實(shí)例代碼
本篇文章主要介紹了Android的WebView與H5前端JS代碼交互的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-07-07Android使用Notification實(shí)現(xiàn)寬視圖通知欄(二)
這篇文章主要為大家詳細(xì)介紹了Android使用Notification實(shí)現(xiàn)寬視圖通知欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12