android使用handlerthread創(chuàng)建線程示例
在android開發(fā)中,一說起線程的使用,很多人馬上想到new Thread(){...}.start()這種方式。
這樣使用當(dāng)然可以,但是多次使用這種方式,會創(chuàng)建多個匿名線程。使得程序運(yùn)行起來越來越慢。
因此,可以考慮使用一個Handler來啟動一個線程,當(dāng)該線程不再使用就刪除,保證線程不會重復(fù)創(chuàng)建。
一般會使用Handler handler = new Handler(){...}創(chuàng)建Handler。這樣創(chuàng)建的handler是在主線程即UI線程下的Handler,
即這個Handler是與UI線程下的默認(rèn)Looper綁定的。Looper是用于實(shí)現(xiàn)消息隊(duì)列和消息循環(huán)機(jī)制的。
因此,如果是默認(rèn)創(chuàng)建Handler那么如果線程是做一些耗時操作如網(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í)際上就一個Thread,只不過它比普通的Thread多了一個Looper。
創(chuàng)建HandlerThread時要把它啟動了,即調(diào)用start()方法。然后創(chuàng)建Handler時將HandlerThread中的looper對象傳入。
HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();
mHandler = new Handler(thread.getLooper());
mHandler.post(new Runnable(){...});
那么這個Handler對象就是與HandlerThread這個線程綁定了(這時就不再是與UI線程綁定了,這樣它處理耗時操作將不會阻塞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中View.post和Handler.post的關(guān)系
這篇文章主要介紹了Android中View.post和Handler.post的關(guān)系,View.post和Handler.post是Android開發(fā)中經(jīng)常使用到的兩個”post“方法,關(guān)于兩者存在的區(qū)別與聯(lián)系,文章詳細(xì)分析需要的小伙伴可以參考一下2022-06-06
Android自定義View繪制貝塞爾曲線實(shí)現(xiàn)流程
貝塞爾曲線的本質(zhì)是通過數(shù)學(xué)計(jì)算的公式來繪制平滑的曲線,分為一階,二階,三階及多階。但是這里不講數(shù)學(xué)公式和驗(yàn)證,那些偉大的數(shù)學(xué)家已經(jīng)證明過了,所以就只講講Android開發(fā)中的運(yùn)用吧2022-11-11
Flutter使用?input?chip?標(biāo)簽組件示例詳解
這篇文章主要為大家介紹了Flutter使用?input?chip?標(biāo)簽組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android編程簡單解析JSON格式數(shù)據(jù)的方法示例
這篇文章主要介紹了Android編程簡單解析JSON格式數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android編程解析json格式數(shù)據(jù)的實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
android開發(fā)之為activity增加左右手勢識別示例
這篇文章主要介紹了android開發(fā)中為activity增加左右手勢識別示例,需要的朋友可以參考下2014-04-04
WorkManager解決應(yīng)用退出后繼續(xù)運(yùn)行后臺任務(wù)
這篇文章主要為大家介紹了WorkManager解決應(yīng)用退出后繼續(xù)運(yùn)行后臺任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
android TextView設(shè)置中文字體加粗實(shí)現(xiàn)方法
android TextView設(shè)置中文字體加粗如何實(shí)現(xiàn),接下來介紹實(shí)現(xiàn)方法,有需要的朋友可以參考下2013-01-01
android實(shí)現(xiàn)手機(jī)傳感器調(diào)用
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)手機(jī)傳感器調(diào)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04
Android編程判斷當(dāng)前指定App是否在前臺的方法
這篇文章主要介紹了Android編程判斷當(dāng)前指定App是否在前臺的方法,涉及Android針對進(jìn)程操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11

