Android开发:从调试App在三星系手机上的拍照问题得到的普遍结论(真的是人人皆知的道理)

       最近在做一个简单的功能实现:拍照上传得到URL-->将得到的URL通过另一个业务接口传给服务器。本来在我的测试机上一点问题都没有,完美运行,然而测试妹子总是过来说,你这个拍照不行啊,拍一张照片没有记录,拍第二章的时候会一起出来,而且有时可以上传有时失败,完全随机的,而且经常看不到图片。经过简单的排查,只有在测试妹子的三星S4和我的三星note3上会出现,于是推测是三星系统的问题,于是用别的三星手机也测试了下,发现都有同样问题,于是开始了调试之旅。


       首先肯定是先debug来定位问题,发现拍照返回来后获取到图片的Activity在接受到了图片地址后就开启了上传图片的线程,接下来Activity居然被销毁了,由于我们的框架会在Activity销毁时调用取消当前Activity内的所有网络请求的方法,由于这个是异步执行的,所以导致了随机的上传失败,另外,如果上传成功了,还会进入到这个业务的第二步通过另一个业务接口上传URL给服务器,这同样还会有刚才的问题。

       先想到的就是,activity结束不再结束当前activity的网络请求,这样先解决了随机失败的问题,然而由于框架的原因,网络请求返回后会把结果返回给发起请求的activity(匿名内部类的原因),这又导致了我在新的activity里无法接收到网络访问结果,于是改用了EventBus来获取这个结果。

至于拍完第一张没有记录,拍到第二张才有记录的问题,这个是由于Activity销毁导致的,所以在拍照/上传图片得到URL/上传URL到业务接口这三个步骤里的数据都会在onSaveInstanceStatus这个函数中保存下来,在onCreate中恢复现场就可以了。

       总结下原因就是由于三星系的Activity在拍照的时候一定会销毁拍照程序下的activity,并且不止一次,而是2次,也就是销毁-重建-再销毁-在重建,这个是通过打log得到对象的hashcode加上生命周期log而得到的。

       再从当前业务推荐到所有业务界面上,其实所有activity都可能会被回收重建,不止是三星拍照,还有锁屏,内存低等等很多导致回收的问题。所以以后应该所有页面都要在onSaveInstanceStatus时保存现场这方面的工作,而不是只有发现问题的页面才做处理。

你可能感兴趣的:(Android开发)