Android——你可能不知道的Debug細(xì)節(jié)
近期在使用Android Studio對(duì)程序進(jìn)行Debug時(shí),發(fā)現(xiàn)了一個(gè)之前自己一直忽視或者說(shuō)不了解的一個(gè)細(xì)節(jié),特此記錄下來(lái)分享給大家。
開發(fā)中,我對(duì)以下一段代碼進(jìn)行了調(diào)試:
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(@NonNull Call<ResponseBody> call, @NonNull Response<ResponseBody> response) {
try {
if (response.isSuccessful()) {
String result = response.body().string();
Gson gson = new Gson();
VehicleEntity vehicleEntity = gson.fromJson(result, VehicleEntity.class);
if (vehicleEntity == null) {
callBack.onNoData();
} else {
callBack.onSuccess(vehicleEntity);
}
} else {
callBack.onFailure();
}
} catch (Exception e) {
e.printStackTrace();
callBack.onFailure();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
callBack.onFailure();
}
});
如上述代碼,是關(guān)于一個(gè)網(wǎng)絡(luò)請(qǐng)求的過(guò)程,然后我在debugger視圖中把result添加到watcher:
image
結(jié)果debug過(guò)程中result一直為一個(gè)空的字符串,而我如果不debug直接運(yùn)行程序,則一切正常,當(dāng)時(shí)我以為這是什么奇怪的bug,百思不得其解。
后來(lái)多方詢問(wèn)終于找出了發(fā)生此現(xiàn)象的原因。大家可以看到我在watcher里面輸出的其實(shí)是一個(gè)語(yǔ)句,
reslut=response.body.string()。而watcher里的語(yǔ)句,會(huì)在你的debug觸發(fā)第一個(gè)斷點(diǎn)時(shí),就會(huì)嘗試執(zhí)行,也就是說(shuō),在我這個(gè)程序遇到第一個(gè)斷點(diǎn)時(shí),“reslut=response.body.string()”這個(gè)語(yǔ)句就已經(jīng)嘗試執(zhí)行了。而巧就巧在okhttp的response.body.string()方法只能有效調(diào)用一次,所以當(dāng)debug真正執(zhí)行到這一句的時(shí)候,get到的string就已經(jīng)是空值了,并不是什么bug。所以大家在調(diào)試程序的時(shí)候,打印變量的方式以及斷點(diǎn)的位置都要有所注意和講究,不要在這上面白白耽誤了自己的時(shí)間~