在項目中,我們經(jīng)常要用到startActivityForResult判族,里面有個參數(shù)requestCode躺盛,經(jīng)常接手別人的項目會發(fā)現(xiàn)這個requestCode大家定義的都很奇怪,經(jīng)常還會看到之前開發(fā)者留下這么一個注釋: 用于XXXX時獲得Activity結(jié)果的Request代碼形帮,開發(fā)者可以隨意修改槽惫。那么真的可以隨意修改嗎?
- 最近在接入韓國OneStroe的SDK用于支付辩撑,從網(wǎng)上照搬過來的代碼定義requestCode的如下
用于購買時獲得Activity結(jié)果的Request代碼界斜,開發(fā)者可以隨意修改。
private val PURCHASE_REQUEST_CODE = 1024
SDK的使用方法代碼大部分都是從網(wǎng)上copy下來的合冀,并且很順利的就接入成功了各薇,讓我覺得,也沒什么難度嘛君躺。但是作為一個有追求的開發(fā)峭判,我不能一模一樣的copy代碼啊开缎,我得改改吧,于是我把之前的注釋刪一刪朝抖,變量命名改一改啥箭,盡可能的讓自己覺得,這個功能是我自己實現(xiàn)的治宣。還有什么可以改的急侥?我一開上面這個requestCode,都注釋我可以隨意更改侮邀, 而且我是個有個性的程序員坏怪,我要是連requestCode都一模一樣使用人家的豈不是顯得我太追求了么?我反手就改成
private val PURCHASE_REQUEST_CODE = 987654321
結(jié)果再次運(yùn)行的時候绊茧。铝宵。就界面毫無反應(yīng)
我開始慌了....
于是我回退到剛copy下來的代碼跑了一下,又可以了华畏。換成我刪了注釋改了變量名的代碼就毫無反應(yīng)鹏秋,也不崩潰。小菜雞開始慌了....
- 猛然驚醒亡笑,我是一名有追求的程序員侣夷,我根據(jù)我敏銳的嗅覺,不報錯那肯定是把異常捕獲了仑乌,點(diǎn)進(jìn)去OneStore的拉起支付源碼看到如下代碼
try {
PurchaseClient.this.launchPurchaseFlowSync(apiVersion, activity, requestCode, productId, productName, productType, payload, gameUserId, promotionApplicable, listener);
} catch (Throwable var2) {
PurchaseClient.this.handleException(handler, listener, var2);
}
不如我所料百拓,設(shè)置斷點(diǎn),通過debug發(fā)現(xiàn)這個var2的Throwable 為
"can only user lower 16 bits for requestcode",大概就知道報錯的原因了晰甚,下面用一段完整(百度)的話作為回答:
因為requestCode不能為負(fù)數(shù)衙传,且不能大于16個字節(jié),要小于2的16次方厕九,范圍為0~65535
上源碼
FragmentActivity-722
@Override
public void startActivityForResult(Intent intent, int requestCode) {
// If this was started from a Fragment we've already checked the upper 16 bits were not in
// use, and then repurposed them for the Fragment's index.
if (!mStartedActivityFromFragment) {
if (requestCode != -1) {
checkForValidRequestCode(requestCode);
}
}
super.startActivityForResult(intent, requestCode);
}
requestCode 為 -1的時候應(yīng)該是有特殊的定義且不討論蓖捶,checkForValidRequestCode這個方法應(yīng)該是對requestCode 進(jìn)行檢查了
/**
* Checks whether the given request code is a valid code by masking it with 0xffff0000. Throws
* an {@link IllegalArgumentException} if the code is not valid.
*/
static void checkForValidRequestCode(int requestCode) {
if ((requestCode & 0xffff0000) != 0) {
throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
}
}
所以這個requestCode。扁远。俊鱼。并不能隨便定義啊。穿香。又踩坑了