java.lang.NoClassDefFoundError: android/os/PersistableBundle 解决一个你难以发现的报错

这个报错也许很多人都遇见过, 如果你遇见过=.=.. 只能说明谷歌爸爸害人不浅..

而且这个报错很隐蔽.. 如果你拿的测试机足够先进(是安卓5.0+系统的话) .. 这个错误是不会出现的.. 而4.4以下则会炸你一个全家桶.. 我就是上线之后才炸的.. 很尴尬.. 一脸懵逼之后.. 我决定探索一下这个错是怎么出来的..

其实异常名称已经写得很清楚.. NoClassDefFoundError 没有找到类的定义错误 .. 啥类? android/os/PersistableBundle.. 我靠? 这是啥类… 没见过啊.. 我也没用你呀!!

解决方法:慎用两个方法

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)

大家应该已经发现.. 这里都用到了上面提到的PersistableBundle 类..第一个onSaveInstanceState是保存界面状态的.. 第二个… 我就不告诉你是干嘛的..

而原本应该使用的方法是

protected void onSaveInstanceState(Bundle savedInstanceState)
protected void onCreate(Bundle savedInstanceState)

那PersistableBundle 是啥呢.. 看英文直译的话… 持久化bundle… (⊙o⊙)持久! 男人怎么能不持久!! 用它丫的.. 然后你就炸了..

原因探究: 版本问题

之前也提到了.. 5.0以上的系统是不会炸的.. 测试很容易测不出来.. 这就很尴尬了.. 难道5.0以上的都是真男人很持久?

然后我就去翻源码了..

4.4及以下..搜索PersistableBundle
4.4以下源码搜索
5.0及以上..搜索PersistableBundle
5.0以上源码搜索

也就是说.. PersistableBundle 是5.0的新特性.. 在4.4里根本没有定义.. 当然也不会有public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)这样的方法.. 难怪找不到类了..

然而onCreate(Bundle savedInstanceState, PersistableBundle persistentState)源码里是这样式的..

public void onCreate(@Nullable Bundle savedInstanceState,
            @Nullable PersistableBundle persistentState) {
        onCreate(savedInstanceState);
    }

坑爹呢这是.. 这不还是原来的onCreate么…

所以可见在创建界面这一点上.. 这两者并没有什么区别.. 只是在PersistableBundle 中可以持久化记录离开界面的状态.. 在oncreate时取出.. 以便开发者去恢复界面状态..

但是话又说回来.. 既然4.4以下不可用.. 为什么谷歌没有对这个方法进行版本限制呢.. 那我哪知道=.= 你去问谷歌爸爸呀..
所以如果你非想用这个持久的家伙.. 只能给方法加上注解@TargetApi()去限制.. 以免爆炸..
而且在Android Studio中带PersistableBundle 的方法经常在前面提示.. 这样开发者很容易不细心就选用了.. 只能说谷歌爸爸害人不浅啊..

好了… 我又阻止了很多场爆炸.. 维护了地球和平… 叫我红领巾就好了=.=

猜你喜欢

转载自blog.csdn.net/Jupiterxx/article/details/53346488