【阿里面试题】BroadcastReceiver 不能执行耗时操作
原因有二:
第一
BroadcastReceiver 一般处于主线程。 耗时操作会导致 ANR
第二
BroadcastReceiver 启动时间较短。
如果一个进程里面只存在一个 br组件。并且在其中开启子线程执行耗时任务。
系统会认为该进程是优先级最低的 空进程。很容易将其杀死。
测试代码:
注册时,指定新进程,便于查看效果:
执行结果:
第一
BroadcastReceiver 一般处于主线程。 耗时操作会导致 ANR
第二
BroadcastReceiver 启动时间较短。
如果一个进程里面只存在一个 br组件。并且在其中开启子线程执行耗时任务。
系统会认为该进程是优先级最低的 空进程。很容易将其杀死。
测试代码:
/** * 时间:2017/12/19 14:05 * @author duqingquan */ public class TestBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int pid = Process.myPid(); LogUtil.d("当前pid ---- " + pid); LogUtil.d("当前线程 ---- " + Thread.currentThread().getName()); new TestThread().start(); } class TestThread extends Thread{ @Override public void run() { for(int i = 0; i < 10; i++){ int pid = Process.myPid(); LogUtil.d("当前pid ---- " + pid); LogUtil.d("TestThread is work ... " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
注册时,指定新进程,便于查看效果:
<receiver android:process=".testBR" android:name=".activity.TestBroadcastReceiver"> <intent-filter> <action android:name="com.dqqdo.test" /> </intent-filter> </receiver>
执行结果: