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。
小欣慰一下,這也算自己爲開源事業做了綿薄的貢獻吧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.