Android源碼Transition.java中發現一個小bug

最近兩天正在看Scene+Transition部分,感覺這部分挺有空間可挖。該部分的功能是,在同一組ViewGroup結構的兩個不同狀態之間做動畫切換,這有助於用戶知道某一個狀態的由來。更進一步,在這組ViewGroup結構中,可以選擇部分view做動畫切換,部分則不。這是個有趣的功能,所以寫了小段代碼測試。

選擇view可以多個方法,比如直接指定view,通過view的id,名字,或種類。不幸的是,通過指定id來指定view的話,其中的remove方法始終出錯,報告ArrayList越界。多次嘗試後查閱該方法的源碼,發現一個小bug。源碼:

    public Transition removeTarget(int targetId) {
        if (targetId > 0) {
            mTargetIds.remove(targetId);
        }
        return this;
    }

其對應的add操作如下:

    public Transition addTarget(int targetId) {
        if (targetId > 0) {
            mTargetIds.add(targetId);
        }
        return this;
    }

在add方法中,int類型的targetId被自動轉換爲Integer類型,當成一個element加進了list。但是在remove方法中,參數是int類型時則對應ArrayList的remove(int position)方法,也即這個targetId被當成ArrayList的偏移量了,也即remove操作的是偏移量爲targetI的的元素,而不是數值爲targetId的那個元素,這顯然不對。考慮到我們一般使用R.id.view_id這個參數來add和remove,故這個remove方法幾乎必然越界。

查詢Stackoverflow並google之後沒有發現相關信息,於是在Android源碼官網上提交了這個小bug:https://code.google.com/p/android/issues/detail?id=163184。由於這個bug簡單清晰且對應到源碼的具體方法了,所以半小時後即獲得確認,狀態由New變成Assigned。

小欣慰一下,這也算自己爲開源事業做了綿薄的貢獻吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章