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的过程展示出来,分享给大家,一起成长。对了,我是“菜鸟起飞了”~~~

原创粉丝点击