耗時方法請一定要做執行緒檢查
阿新 • • 發佈:2019-02-13
前言
主執行緒又稱UI執行緒,是不能做耗時任務的,否則會導致UI介面卡頓甚至ANR。 最常見的case就是如果我們在主執行緒做訪問網路操作會丟擲NetworkOnMainThreadException異常,丟擲這個異常是因為Android在StrictMode中做了相應的檢查,如果發現主執行緒有訪問網路的行為就會主動終止並丟擲異常。
public void onNetwork() {
if ((mPolicyMask & DETECT_NETWORK) == 0) {
return;
}
if ((mPolicyMask & PENALTY_DEATH_ON_NETWORK) != 0) {
throw new NetworkOnMainThreadException();
}
if (tooManyViolationsThisLoop()) {
return;
}
startHandlingViolationException(new NetworkViolation());
}
解決方法
日常開發中也不可避免的會寫一些需要耗時的任務,時間久了有可能忘記或是其他人在使用的時候並不知道這個方法是耗時的,所以請一定要在耗時的方法裡面做執行緒檢查,提醒使用者注意不要在主執行緒使用該方法。
if(Thread.currentThread() == Looper.getMainLooper().getThread()) {
throw new RuntimeException("Should not be called in main thread.");
}