美文网首页Android深入浅出AndroidAndroid开发
安卓Support Library 25.1.0版本切换Frag

安卓Support Library 25.1.0版本切换Frag

作者: 贪玩学爸 | 来源:发表于2016-12-22 21:54 被阅读608次

前几天,把项目中的support library的版本号从25.0.1升级到25.1.0之后,出现了好多莫名其妙的bug,后来经过排查才发现是升级版本号之后,Fragment切换时生命周期函数的执行顺序发生了变化。网上也有反馈,下面把这个坑整理一下,希望能帮大家提个醒。

在25.1.0以前,通过FragmentTransaction的replace方法从FragmentA切换到FragmentB的时候,生命周期函数的执行顺序如下:

D/FragmentA: onPause()
D/FragmentA: onStop()
D/FragmentB: onStart()
D/FragmentB: onResume()

先执行FragmentA的onPause和onStop,然后再执行FragmentB的onStart和onResume。

但是25.1.0之后,从FragmentA切换到FragmentB的时候,生命周期函数的执行顺序变成:

D/FragmentB: onStart()
D/FragmentB: onResume()
D/FragmentA: onPause()
D/FragmentA: onStop()

先执行了FragmentB的onStart和onResume方法,然后才执行FragmentA的onPause和onStop方法。而我们的项目中,分别在onStart和onStop方法中执行了一些操作,这样执行的顺序完全变了,导致了一些bug。

想要恢复成以前的执行顺序也是有办法的,可以调用FragmentTransaction.setAllowOptimization(false)方法,这样生命周期函数的执行顺序和之前是一样的。

getFragmentManager()
    .beginTransaction()
    .setAllowOptimization(false)
    .replace(R.id.container, FragmentA.newInstance(), FragmentA.class.getSimpleName())
    .commit();

关于这个问题的更多解释说明可以参考这个issues_230415,github上面有人已经写了一个小Demo,可以从log信息里面看到执行的顺序。还有Google上搜到的一篇文章,虽然是日语写的,不过大概也能猜出来写的是什么意思吧,放在这里供大家参考。

另外还有几个问题,可以参考StackOverflow上的这个问题,对应的讨论在issues_230191里面也有。我们的项目中遇到了setVisibility的问题,但是目前并没有发现导致问题的原因,而且大家对于问题的表述不尽相同,所以我也不知道应该如何处理更好。我们的项目中暂时还是回退到25.0.1版本,等到25.1.0版本的bug解决之后再做处理。

目前发现的升级到25.1.0之后的问题就是这些,以后如果还有新的问题再来补充,希望对大家有帮助。同时,如果大家发现升级之后的问题,也可以在下面留言,大家共同讨论讨论。

相关文章

网友评论

  • 76ffef5441ab:能把坑,贴出来吗
    贪玩学爸: @会编程的_宁采臣 我目前遇到的坑就是切换Fragment的时候,onStop和onStart函数的执行顺序发生了改变。
  • hunter886:谢谢分享
  • 钟子明: :kissing_heart: thank for share
    妙法莲花1234: @leesniper 给老大顶一下,哈哈,强迫症(* ̄m ̄)
    贪玩学爸: @钟子明 我们老大经常把各种库都更新到最新版本,为此也踩了不少坑,有用得着的地方尽量分享给大家。
  • CnPeng:感谢分享
  • MangoLee:谢作者填坑!!
    钟子明:@MangoLee 实在是太腻害了,还好还没升级就看到了

本文标题:安卓Support Library 25.1.0版本切换Frag

本文链接:https://www.haomeiwen.com/subject/ufphvttx.html