onActivityResult()和setResult()的调用时机
来源:互联网 发布:情定三生知夏向天吻戏 编辑:程序博客网 时间:2024/06/05 04:31
onActivityResult()和setResult()的调用时机
业务上需求
在Activity_A中开启 Activity_B,并在Activity_B关闭的时候,将Activity_B中用户编辑的数据反馈给Activity_A。
实现方法
在Activity_A中通过 startActivityForResult()
开启Activity_B,并在Activity_B中调用setResult()
.
问题
运行程序结果发现直接报空指针异常,怎么可能?我调用的函数没有问题啊?
分析
根据异常日志,详细分析错误的那一行,发现只有data有空指针的可能,也就是说调用onActivityResult()的时候,data并没有初始化值,继续倒着分析,data在哪里应该在哪里初始化呢?没错,就是Activity_B中的setResult()方法。问题分析到这,已经快看到本质了,归根结底就是Activity_B中的setResult()在Activity_A中的onActivityResult()之后调用。好神奇啊,明明我就是在Activity_B的onDestory()中调用的setResult()啊,然后Activity_A才开启的啊,为嘛还是出现调用的顺序错乱呢?
探究两个Activity生命周期调用顺序
既然调用顺序乱了,那就在各个生命周期方法中打Log,这回就该显示真正的调用顺序了吧。出人意料,两个Activity的生命周期方法调用顺序和我想的不一样,下面请看真相图:
从上述图片可以看出,在从Activity_B返回到Activity_A的时候,onActivityResult()首先会被调用,然后才是其他的生命周期方法。
修改Bug
既然在onDestory()中调用不对,那我就在onCreate()中调用setResult()试试。一运行,嗯,就是这样,程序终于能够跑起来了,这就对了嘛,Activity_A也拿到数据了,哈哈哈。。。等等,不对啊,Activity_A获取的数据不对啊,我在Activity_B明明已经修改了,为啥还是之前的数据,说好的响应用户编辑呢?
问题又来了
继续分析问题,现在我是在onCreate()中调用的setResult(),问题显而易见,Activity初始化调用onCreate()之后,用户才编辑数据,所以setResult()返回的是错误的。现在就尴尬了,在onDestory()调用,倒是能够获取用户最新编辑的数据,但是Activity_A报空指针;在onCreate()中调用倒是不报空指针,但是数据不是最新的,我的天,能不能不要这样纠结?
有方法了
就在万般无奈之际,忽然发现天空划过一颗流星,对啊,用户点击Back键的时候,在onDestory()之前会不会有什么回调呢?没错,就是onBackPressed(),在这个回调中,会调用finish()函数,下面再看回调过程:
有了,能不能重写该方法,在finish()之前调用setResult()呢?说整就整,修改代码,程序跑起来,嗯~~~,可以的,没有挂掉,检查结果,可以的,的确是用户最新编辑的。这个方法完美的解决了上述问题的冲突,既能响应用户最新编辑的数据,又能不发生异常。
总结反思
到这里,问题已经解决了,那么总结一下吧:
- 1、两个Activity之间切换时,生命周期方法的顺序有点出人意料哟;
- 2、解决Bug时,打Log还挺好用,哈哈;
- 3、这个是重点,文章主题的两个函数调用,有兴趣的可以在其他函数中调用试试看效果。
- 4、还可以在onPause() 中调用,可以试试。
后记
这是本人第一次写文章,解决的问题不大,我就是试着将自己碰到Bug、解决Bug的过程展示出来,分享给大家,一起成长。对了,我是“菜鸟起飞了”~~~
- onActivityResult()和setResult()的调用时机
- Android Activity 中 onActivityResult() 与 setResult()的调用时机
- Android Activity 中 onActivityResult() 与 setResult()的调用时机
- Android Activity 中 onActivityResult() 与 setResult()的调用时机
- Android Activity 中 onActivityResult() 与 setResult()的调用时机
- setResult()的调用时机
- setResult()的调用时机
- Android setResult()的调用时机
- Android初学习 - Activity 中 onActivityResult() 与 setResult()的调用时机
- android中setResult的调用时机
- setResult和onActivityResult的用法小记
- startActivityForResult()、onActivityResult()和setResult()使用
- startActivityForResult()、onActivityResult()和setResult()使用
- startActivityForResult和setResult详解 onActivityResult
- Android中的onActivityResult和setResult
- Android应用开发—setResult()的调用时机
- onActivityResult接收的Result和setResult的值不一致
- Android中的onActivityResult和setResult方法的使用
- hadoop实战随笔_0712
- Informatica十年深耕细作,成就云数据管理领航者
- 微分方程之液体冷却
- 页面动态追加代码点击事件无效解决
- CSS3学习笔记-圆角
- onActivityResult()和setResult()的调用时机
- sqoop安装文档
- inline-内联函数
- log4j
- Python的os模块
- Vue的异步组件
- APP安装包为什么这么大
- 实现版本更新
- Kettle中常用的js函数