在一個service中我們使用stopselfresult()時的一些問題,當我在service中創(chuàng)建一個如下的函數:
public void Print(){
for(int i=0;i<100;i++){
try {
Thread.sleep(1000);
if(i==11){
Log.i("Logcat", "qianmian de i="+i);
boolean b=stopSelfResult(mStartId);
boolean b1=false;
Log.i("Logcat", ""+b);
Log.i("Logcat", "houmian de i="+i);
Thread.sleep(20000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i("Logcat", "i="+i);
}
}
這個函數的功能很簡單惰许,然后我們在onstartcommand()方法中調用倔监,我們采用如下兩種方式直砂,第一種
是直接調用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
mStartId=startId;
Log.i("Logcat", ""+mStartId);
Print();
return super.onStartCommand(intent, flags, startId);
}
同時為了驗證效果,我們在ondestroy()方法中寫一條log語句浩习,
@Override
public void onDestroy() {
// TODO Auto-generated method stub
Log.i("Logcat", "onDestroy");
super.onDestroy();
}
然后我們看結果静暂,這個程序的輸出結果的主要部分是:
...
i=10
qianmian de i=11
true
houmian de i=11
i=11
i=12
...
onDestroy
而如果我們采用第二種方式就是創(chuàng)建一個新線程的方式,在onstartCommand()中調用這個函數谱秽,方式如下:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
mStartId=startId;
Log.i("Logcat", ""+mStartId);
Thread t=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Print();
}
});
t.start();
return super.onStartCommand(intent, flags, startId);
}
這個結果如下:
...
i=10
qianmian de i=11
true
houmian de i=11
onDestroy
i=11
i=12
...
也就是說洽蛀,創(chuàng)建一個新的子線程中調用和在主線程中調用結果不同摹迷,在子線程中是會直接調用ondestroy()
方法,然后接著執(zhí)行onstartCommand()
方法郊供,在主線程中是繼續(xù)執(zhí)行onstartCommand()
方法峡碉,再去執(zhí)
行ondestroy()
方法。為什么呢颂碘?等我看完主線程與子線程再來解決這個問題异赫。同時,這里還得提一點头岔,
看到這個輸出結果塔拳,有人可能會說執(zhí)行onDestroy()
方法是需要時間的,因為輸出語句true
在houmian de i=11
前面峡竣,而houmian de i=11這條輸出語句在onDestroy
前面靠抑,也就是說這時stopselfResult()
方法已經執(zhí)行
完了,而ondestroy()
方法還在執(zhí)行一段時間后再打印ondestroy語句适掰。也就是說onDestroy()
方法是需要時
間來執(zhí)行的颂碧。其實不是,你可以使用在activity
中調用stopService()
方法的方式來終止服務类浪,你會發(fā)現
onDestroy
在你按下的時候馬上就打印出來了载城,也就是說onDestroy()
方法并不會耗費時間,那么這個輸出結果
是怎么回事呢费就?感覺可能是stopselfResult()
方法和ondestroy()
方法之間的調用花了時間诉瓦。