错误堆栈:
ActivityManager: ANR in com.oppo.reader PID: 8071
Reason: executing service com.oppo.reade//com.zhangyue.iReader.service.VoiceService
这个问题只在oppo A53 2G的运行内存手机上出现。 android 5.1
错误分析:
有这个问题,我第一反应是:com.zhangyue.iReader.service.VoiceService 这个service里面有超时的问题,但是,我把这个Service 里面的所有代码都注释掉了。还是有ANR!
我说,难道单独写一个Service 在这个手机上,什么都不做也会ANR? 我写了一个demo,人还是不能懒得。然后发现,没有问题。说明,和这个手机没有关系。
然后我就无语了。我就告诉我们老大,说:我把这个Service 里面的所有代码都注释掉了。还是有ANR!当时我们老大说,这只能说明,产生这个问题和这个Service没有关系!我竟然没有推理出这样的结论,恨自己!说明出问题的地方不在这里!
后来他说让我try catch 一个启动服务的地方:
Context context = IreaderApplication.getInstance();
Intent intent = new Intent(context, VoiceService.class);
intent.putExtra("list", (ArrayList) playlist);
intent.putExtra("name", bookName);
intent.setAction(VoiceService.ACTION_SET_PLAYLIST);
context.startService(intent);
我加上try catch ,发现还是会ANR! 我就觉得和try catch 没关系,因为如果发生了异常,肯定当时就崩溃了。不会20s之后ANR. 然后他说,你把这块代码注释掉,注释掉之后,果然没有问题了!
也就是问题是由于这一坨代码产生的。因为这段代码设置了一个action,我去调试,断点这个Service 的ACTION_SET_PLAYLIST这里,发现根本没有走到这里来。说明服务没有启动起来。 但是其他的action 都可以启动起来!
这里会传递一个playlist的ArrayList, 我调试的时候,发现他有980多条!这么大的数据,导致启动服务的时候,ANR了。我擦,这么大的数据,你竟然putExtra 去传递!怪不得有问题。
解决问题:
这个playlist,我就换一种传递方式。比如写个DataManage, 里面有个set 方法,你把数据设置进去就可以了。我其他地方要取用的话,直接get 拿到数据就可以了。
总结
1.禁止启动四大组件的时候,在Intent 里面传递过大的数据!可能导致ANR。
2.这个问题只在oppo A53 2G的运行内存手机上出现。 android 5.1 说明该手机太差劲了。有些问题就喜欢在一些很差劲的手机上面出现。
3.这种ANR 问题,App 是无法拿到信息的。只有手机room厂商才能拿到。很无奈。所以,市面上有多少这种问题,不得而知。当时是用户反馈,才知道这个问题的。