Android高手進(jìn)階教程(十九)之---Android開(kāi)發(fā)中,使用線程應(yīng)該注意的問(wèn)題!
我們都知道Hanlder是線程與Activity通信的橋梁,我們?cè)陂_(kāi)發(fā)好多應(yīng)用中會(huì)用到線程,有些人處理不當(dāng),會(huì)導(dǎo)致當(dāng)程序結(jié)束時(shí),線程并沒(méi)有被銷(xiāo)毀,而是一直在后臺(tái)運(yùn)行著,當(dāng)我們重新啟動(dòng)應(yīng)用時(shí),又會(huì)重新啟動(dòng)一個(gè)線程,周而復(fù)始,你啟動(dòng)應(yīng)用次數(shù)越多,開(kāi)啟的線程數(shù)就越多,你的機(jī)器就會(huì)變得越慢。
為了方便 大家理解,我寫(xiě)一個(gè)簡(jiǎn)單的Demo.功能就是每2秒中將應(yīng)用的Title更換一次。具體步驟如下:
第一步:新建一個(gè)Android工程命名為T(mén)hreadDemo。
第二步:修改ThreadDemo.java,代碼如下:
[java]?view plaincopy package?com.tutor.thread;???import?android.app.Activity;???import?android.os.Bundle;???import?android.os.Handler;???import?android.util.Log;???public?class?ThreadDemo?extends?Activity?{???????private?static?final?String?TAG?=?"ThreadDemo";???????private?int?count?=?0;???????private?Handler?mHandler?=??new?Handler();??????????????private?Runnable?mRunnable?=?new?Runnable()?{??????????????????????public?void?run()?{???????????????//為了方便?查看,我們用Log打印出來(lái)???????????????Log.e(TAG,?Thread.currentThread().getName()?+?"?"?+count);???????????????count++;???????????????setTitle(""?+count);???????????????//每2秒執(zhí)行一次???????????????mHandler.postDelayed(mRunnable,?2000);???????????}??????????????????};???????@Override??????public?void?onCreate(Bundle?savedInstanceState)?{???????????super.onCreate(savedInstanceState);???????????setContentView(R.layout.main);????????????//通過(guò)Handler啟動(dòng)線程???????????mHandler.post(mRunnable);???????}??????????}????第三步:運(yùn)行上述工程,查看運(yùn)行效果:
當(dāng)然上面不是重點(diǎn),退出應(yīng)用時(shí),線程還在跑,打開(kāi)Logcat視窗或者cmd終端查看,如下(剛吃了午餐回來(lái),線程還在跑著):
當(dāng)我們?cè)俅螁?dòng)應(yīng)用時(shí),會(huì)重新啟動(dòng)一個(gè)新的線程,如下圖所示:
所以我們?cè)趹?yīng)用退出時(shí),要將線程銷(xiāo)毀,我們只要在Activity中的,onDestory()方法處理一下就OK了,如下代碼所示:
[java]?view plaincopy @Override????protected?void?onDestroy()?{???????mHandler.removeCallbacks(mRunnable);???????super.onDestroy();?????}????所以ThreadDemo.java的完整代碼如下:
[java]?view plaincopy package?com.tutor.thread;???import?android.app.Activity;???import?android.os.Bundle;???import?android.os.Handler;???import?android.util.Log;???public?class?ThreadDemo?extends?Activity?{???????private?static?final?String?TAG?=?"ThreadDemo";???????private?int?count?=?0;???????private?Handler?mHandler?=??new?Handler();??????????????private?Runnable?mRunnable?=?new?Runnable()?{??????????????????????public?void?run()?{???????????????//為了方便?查看,我們用Log打印出來(lái)???????????????Log.e(TAG,?Thread.currentThread().getName()?+?"?"?+count);???????????????count++;???????????????setTitle(""?+count);???????????????//每2秒執(zhí)行一次???????????????mHandler.postDelayed(mRunnable,?2000);???????????}??????????????????};???????@Override??????public?void?onCreate(Bundle?savedInstanceState)?{???????????super.onCreate(savedInstanceState);???????????setContentView(R.layout.main);????????????//通過(guò)Handler啟動(dòng)線程???????????mHandler.post(mRunnable);???????}??????????????@Override??????protected?void?onDestroy()?{???????????//將線程銷(xiāo)毀掉???????????mHandler.removeCallbacks(mRunnable);???????????super.onDestroy();???????}???}????Ok~今天就寫(xiě)到這里,我午休去也~大家有不明白的可以留言!