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

1 篇文章 0 订阅
1 篇文章 0 订阅

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

而且这个报错很隐蔽.. 如果你拿的测试机足够先进(是安卓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 的方法经常在前面提示.. 这样开发者很容易不细心就选用了.. 只能说谷歌爸爸害人不浅啊..

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值