在一个service中我们使用stopselfresult()时的一些问题,当我在service中创建一个如下的函数:
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
而如果我们采用第二种方式就是创建一个新线程的方式,在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
...
也就是说,创建一个新的子线程中调用和在主线程中调用结果不同,在子线程中是会直接调用ondestroy()
方法,然后接着执行onstartCommand()
方法,在主线程中是继续执行onstartCommand()
方法,再去执
行ondestroy()
方法。为什么呢?等我看完主线程与子线程再来解决这个问题。同时,这里还得提一点,
看到这个输出结果,有人可能会说执行onDestroy()
方法是需要时间的,因为输出语句true
在houmian de i=11
前面,而houmian de i=11这条输出语句在onDestroy
前面,也就是说这时stopselfResult()
方法已经执行
完了,而ondestroy()
方法还在执行一段时间后再打印ondestroy语句。也就是说onDestroy()
方法是需要时
间来执行的。其实不是,你可以使用在activity
中调用stopService()
方法的方式来终止服务,你会发现
onDestroy
在你按下的时候马上就打印出来了,也就是说onDestroy()
方法并不会耗费时间,那么这个输出结果
是怎么回事呢?感觉可能是stopselfResult()
方法和ondestroy()
方法之间的调用花了时间。