Glide-You cannot start a load for a destroyed activity
場景:
在獲取本地相簿的時候,載入大量資料,開啟介面,然後很快finish介面,就會出現You cannot start a load for a destroyed activity,因為finish的時候,圖片還沒有被夾在完,Glide.with(mContext).load(bitmapLast).into(binding.itemPhoto);mContext為空導致,所以需要判斷activity是否ondestory().
最後在AS裡面搜尋RequestManagerRetriever才發現是Glide裡面的類,具體定位到:
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private static void assertNotDestroyed(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed()){
throw new IllegalArgumentException("You cannot start a load for a destroyed activity");
}
}1
很明顯說的是Activity已經被Destroy了所以報錯。
解決方案:
在我的SplashActivity 類裡面有一個Handler的延時顯示網路圖片的操作,當Handler發出訊息時SplashActivity已經被Destroy了所以導致Glide報錯,這裡只需要判斷一下當前Activity是否被Destroy了就好了:
//判斷Activity是否Destroy
public static boolean isDestroy(Activity activity) {
if (activity == null || activity.isFinishing() || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())) {
return true;
} else {
return false;
}
}12345678
呼叫:
虛擬碼
if(!isDestroy(activity)){
Glide.with(activity).into(imageview);
}123
上面只是大致程式碼,具體邏輯參照自己的業務。
其實報錯的地方不止上面一處,還有一處是在Fragment裡面呼叫的時候。下面給出在Fragment 裡面解決方案:
Fragment
在Fragment裡面我們就不是判斷Destroy方法了,而是isAdded() 方法,這是Fragment 給我們提供的方法,用來判斷當前Fragment是否新增到Activity了。這裡樓主是在網路請求成功後做判斷:
虛擬碼:
RequestUtils.get(url).callback(){
@Override
public void onHttpRequestSuccess() {
f (!isAdded()) {
return;
}
Glide.with(this).into(imageview);
}
}123456789
以上就是使用Glide 在Acitivty 和 Fragment裡面出現的問題及解決方式。
不過在解決問題的途中還發現有網友說將Glide.with(this) 裡面的this換成mContext.getApplicationContext() 也就是生命週期同App一樣了,在這裡樓主覺得不妥,事實上此方法對樓主也無效;Glide既然給我們提供了不同型別的傳參,說明對生命週期這塊也是有考量;傳入全域性只會消耗更多記憶體,當然有特殊需求例外。
---------------------
作者:Mackkill
來源:CSDN
原文:https://blog.csdn.net/mackkill/article/details/78068203
版權宣告:本文為博主原創文章,轉載請附上博文連結!