Android ANR终极解决 android.app.RemoteServiceException: Context.startForegroundService()
问题现象android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()通过startForegroundService(Intent intent)启动服务时,如果服务没有及时(5s)使用startForeground()响应,那么就会报
问题现象
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
通过startForegroundService(Intent intent)启动服务时,如果服务没有及时(5s)使用startForeground()响应,那么就会报这个异常。
问题原因和解决
1. Service startForeground之前的代码过于复杂
在Service的 onCreate 或者 onStartCommand 里我们会调用startForeground 方法。很多时候我们都会构造一个Notification。
这里我们可以将构建Notification的时机提前,使用全局静态变量的方式构建好,然后再调用startForeground方法,Service里直接取即可。
2. UI线程(主线程)阻塞
因为Service的生命周期方法是在主线程中Handler调用的,所以,如果调用时主线程阻塞,则会引起ANR和崩溃。
如果是非常及时需要刷新或提示,非得立马调用startForegroundService的。我们可以手动排除调用时机前后的耗时方法。
如果不是及时方法,可以通过IDelHandler的方式进行处理。添加IdelHandler消息,当主线程稍微闲置时再调用startForegroundService
其他解决
网上还有很多解决方案。但都不是从根本上进行解决的。可能也有用,大家可以参考。我理解,解决问题还是要从根源上进行避免
更多推荐
所有评论(0)