上一篇文章中,傻蛋提到了BroadcastReceiver是Android中最轻薄、最短小的组件,它的对象生命周期十分短暂,经过傻蛋测试在BroadcastReceiver中让线程睡眠10秒(Activity是5秒钟)的话,Android就会弹出错误(和Activity超时的错误相同),同时需要注意的是Activity、Service和BroadcastReceiver都是运行在本进程的主线程里面的。通过这个测试让傻蛋进一步产生了疑问,如果在Service中处理一个长时间的任务会怎么样?
启动一个Service,然后在Service的onCreate()方法中添加如下代码:
- try {
-
- Log.v(TAG , "sleep start …..");
-
- Thread.sleep(20000);
-
- Log.v(TAG,"sleep end …..");
-
- } catch (InterruptedException e) {
-
-
-
- / / TODO Auto-generated catch block
-
- e.printStackTrace();
-
- }
单就是让Service睡眠20秒钟,我们会发现,sleep start…. 和 sleep end….这两个日志打印出来了,但是后台还会出现如下错误,前台弹出no response超时对话框。
当傻蛋在onCreate()中新启动一个线程来,睡眠时,程序正常。
所以总结一下:无论是 Activity、BroadcastReceiver还是Service,只要是有长时间处理的任务,就需要重新开一个线程来处理,为什么会这样?因为他们都是运行在主线程中的。