Service中有关于stopselfResult()方法的一些问题

来源:互联网 时间:2017-01-13

在一个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()方法之间的调用花了时间。




相关阅读:
Top