Android高手進(jìn)階教程(十九)之---Android開發(fā)中,使用線程應(yīng)該注意的問題!
我們都知道Hanlder是線程與Activity通信的橋梁,我們在開發(fā)好多應(yīng)用中會(huì)用到線程,有些人處理不當(dāng),會(huì)導(dǎo)致當(dāng)程序結(jié)束時(shí),線程并沒有被銷毀,而是一直在后臺(tái)運(yùn)行著,當(dāng)我們重新啟動(dòng)應(yīng)用時(shí),又會(huì)重新啟動(dòng)一個(gè)線程,周而復(fù)始,你啟動(dòng)應(yīng)用次數(shù)越多,開啟的線程數(shù)就越多,你的機(jī)器就會(huì)變得越慢。
為了方便 大家理解,我寫一個(gè)簡單的Demo.功能就是每2秒中將應(yīng)用的Title更換一次。具體步驟如下:
第一步:新建一個(gè)Android工程命名為ThreadDemo。
第二步:修改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打印出來???????????????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);????????????//通過Handler啟動(dòng)線程???????????mHandler.post(mRunnable);???????}??????????}????第三步:運(yùn)行上述工程,查看運(yùn)行效果:
當(dāng)然上面不是重點(diǎn),退出應(yīng)用時(shí),線程還在跑,打開Logcat視窗或者cmd終端查看,如下(剛吃了午餐回來,線程還在跑著):
當(dāng)我們再次啟動(dòng)應(yīng)用時(shí),會(huì)重新啟動(dòng)一個(gè)新的線程,如下圖所示:
所以我們在應(yīng)用退出時(shí),要將線程銷毀,我們只要在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打印出來???????????????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);????????????//通過Handler啟動(dòng)線程???????????mHandler.post(mRunnable);???????}??????????????@Override??????protected?void?onDestroy()?{???????????//將線程銷毀掉???????????mHandler.removeCallbacks(mRunnable);???????????super.onDestroy();???????}???}????Ok~今天就寫到這里,我午休去也~大家有不明白的可以留言!