getArguments的ClassCastException,魅族Flyme的負優化
背景
前段時間在進行視訊相關業務重構後,上線發現移除比較大量的崩潰,主要集中在魅族使用者,安卓6.0以上系統中,崩潰資訊如下:
Fatal Exception: java.lang.ClassCastException java.lang.String cannot be cast to com.netease.nr.biz.video.bean.BaseVideoBean com.netease.newsreader.newarch.video.detail.main.router.VideoDetailBundleBuilder.parse_aroundBody0 (VideoDetailBundleBuilder.java:39) com.netease.newsreader.newarch.video.detail.main.router.VideoDetailBundleBuilder$AjcClosure1.run (VideoDetailBundleBuilder.java:1) org.aspectj.runtime.reflect.JoinPointImpl.proceed (JoinPointImpl.java:149) com.netease.patch.PatchWeaveUtils.weaveJoinPoint (PatchWeaveUtils.java:66) com.netease.patch.AspectSpecControler.weavePatchLogic (AspectSpecControler.java:211) com.netease.patch.AspectSpecControler.weaveAppNewsreader (AspectSpecControler.java:67) com.netease.newsreader.newarch.video.detail.main.router.VideoDetailBundleBuilder.parse (VideoDetailBundleBuilder.java:36) com.netease.newsreader.newarch.video.detail.main.view.ViperVideoDetailFragment.initContentFragment_aroundBody66 (ViperVideoDetailFragment.java:386) com.netease.newsreader.newarch.video.detail.main.view.ViperVideoDetailFragment$AjcClosure67.run (ViperVideoDetailFragment.java:1)
在Fragment一處獲取Bundle的地方,Bundle取存入的一個Serializable物件,取出來發現是String,強轉成特殊型別BaseVideoBean後崩潰,確認邏輯沒有問題後,在Flyme社群諮詢無果。
負優化的坑
後來持續調研分析,發現在ViperVideoDetailFragment的onCreate時,獲取的Bundle取出Serializable確實為BaseVideoBean型別

image
但是在網路資料回來以後,再去通過getArguments()讀取BaseVideoBean型別,就被莫名其妙的負優化成了String型別,打斷點準確分析,發現在開啟一次子執行緒操作後(處理本地資料)回到UI執行緒,該物件就變成了String型別。

image
解決方案
因為魅族存在類似問題,所以getArguments()最好在OnCreate等初始化生命週期統一讀取儲存為成員變數,便於後續使用,避免類似相容性問題。