androidX迁移问题记录

本文记录了项目,从support库,迁移到了最新的androidx库,迁移后一些兼容性问题处理。

迁移过程很顺利,后续自动化测试发现有两个问题,都是关于FloatingActionButton

1、崩溃 android.os.BadParcelableException: ClassNotFoundException when unmarshalling

复现条件:首页有FloatingActionButton,子页模拟app杀死重建。退出子页回到首页,崩溃。
原因:我们继承了FloatingActionButton,重写了保存恢复函数,在恢复的时候,ClassLoader为Null导致崩溃。
详细可以参考:https://wangchao.im/2016/10/12/android-badpracelableexception/

解决办法:使用系统提供的方法保存、恢复View的数据。

核心类
public class XLViewSavedStateHelper {

    private static final String BUNDLE_KEY = "XL_VIEW_BUNDLE_KEY";

    public static Bundle saveState(Parcelable parcelable) {
        if (parcelable == null) return null;

        if (parcelable instanceof Bundle) return (Bundle) parcelable;

        Bundle bundle = new Bundle();
        bundle.putParcelable(BUNDLE_KEY, parcelable);
        return bundle;
    }

    public static Parcelable getXLSaveParcelable(Parcelable state) {
        if (state instanceof Bundle) {
            return ((Bundle) state).getParcelable(BUNDLE_KEY);
        }
        return null;
    }

    public static boolean isXLSave(Parcelable parcelable) {
        return parcelable instanceof Bundle && ((Bundle) parcelable).getParcelable(BUNDLE_KEY) != null;
    }

}
使用方式
 private static final String KEY_PASSED_TIME = "KEY_PASSED_TIME";
    private static final String KEY_SYSTEM_CLOCK_TIME = "KEY_SYSTEM_CLOCK_TIME";

    @Override
    public Parcelable onSaveInstanceState() {
        Bundle bundle = XLViewSavedStateHelper.saveState(super.onSaveInstanceState());
        if (bundle != null) {
            bundle.putLong(KEY_PASSED_TIME, mPassedTime);
            bundle.putLong(KEY_SYSTEM_CLOCK_TIME, SystemClock.elapsedRealtime());
        }
        return bundle;
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        if (!XLViewSavedStateHelper.isXLSave(state)) {
            super.onRestoreInstanceState(state);
            return;
        }

        super.onRestoreInstanceState(XLViewSavedStateHelper.getXLSaveParcelable(state));
        Bundle bundle = (Bundle) state;
        long passedTime = bundle.getLong(KEY_PASSED_TIME);
        long systemTime = bundle.getLong(KEY_SYSTEM_CLOCK_TIME);
        mPassedTime = passedTime + SystemClock.elapsedRealtime() - systemTime;
    }

2、同时操作FloatingActionButton,按钮图标丢失

复现条件:首页fab按钮,多个tab下的子页会去同时更新按钮状态,fab的图标丢失了。
原因:在androidX上出现,support库里的FloatingActionButton不会有这个问题。排查源码未找到原因
解决办法:限制更新频率,本质上来说,fab按钮只由当前页面来管理,其余不可见的页面,发出的更新请求应该被过滤掉。

观察了下很多更新请求,setImageResource()的操作都是同样的图片源,因此也可以简单粗暴的解决这个问题。

public class SafeFloatingActionButton extends FloatingActionButton {
    private Integer mPreviousRes;

    public SafeFloatingActionButton(Context context) {
        super(context);
    }

    public SafeFloatingActionButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SafeFloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setImageResource(int resId) {
        if (mPreviousRes != null && mPreviousRes == resId) return;

        mPreviousRes = resId;
        super.setImageResource(resId);
    }
}

总结

安卓因为历史原因,有supportV4、supportV7两大库,现在androidX可以终结掉这个分裂现象。官方提供的升级指引很简单方便,咱千万用户的app迁移下来很顺利,只发现这两处问题。

彩蛋

经过迁移后,项目里面搜.support.找到了android.support.FILE_PROVIDER_PATHS这个7.0引入的FileProvider,路径就是这样的哦,设计如此。

    <provider
            android:name=".file.XLFileProvider"
            android:authorities="${applicationId}.xlcore.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/xl_file_paths"/>
        </provider>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容