1. 程式人生 > >用Glide載入圖片到Recyclerview中有時候只顯示佔位圖的問題

用Glide載入圖片到Recyclerview中有時候只顯示佔位圖的問題

1、IllegalArgumentException: You cannot start a load for a destroyed activity

    @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"); } }

這裡就是產生報錯地方的原始碼,這裡是丟擲IllegalArgumentException異常,看原始碼可知丟擲異常的條件有兩個, 一個條件是Android版本號大於J,另一個條件activity.isDestroyed()都為真時,才丟擲這個異常。現在Android版本號基本都是大約J了,而當我們activity銷燬後,Glide還在工作,這時就丟擲了這個異常了。也就是說當Activity會銷燬了,則丟擲了異常,為什麼會這樣呢?因為我們的Glide是有生命週期的,Glide.with()中傳入的context引數就是代表了Glide生命週期,比如傳入Activity的Context則當Activity銷燬時,Glide應該停止載入資料,畢竟這時即使Glide載入了資料也沒地方顯示呀,這不是浪費流量嗎。因此當Activity結束時,Glide也要停止載入資料。
最後得出的解決方法是儘量使用全域性的生命週期,也就是Glide.with(context.getApplicaiontContext()).into(imageView);

2、用Glide載入圖片顯示在Recyclerview中結果有時候只顯示佔位圖

這個跟業務場景有關,我們專案中載入圖片比較多,在一個A Activity中用Glide載入圖片在Recyclerview正常顯示了圖片,點選某個item後進去B Activity,B中繼續用Glide載入圖片,結果返回到A Activity,上下滑動Recyclerview時結果全部都是佔位圖。
花了大量的時間,發現我們在B Activity中的onDestroy方法中加入了Glide.with(context.getApplicationContext()).pauseRequests();


這裡的with()方法中傳入的是全域性Context,則當關閉Glide時,則相當於關閉了這個應用的Glide載入圖片,於是A Activity中的Glide載入圖片也關了。當Recyclerview中滑動時,本來應用是顯示Glide快取中的圖片,結果關閉了Glide載入資料,就連快取的圖片都不能載入了,圖片區域就顯示了佔位圖。
這裡可以在需要載入圖片的地方及時加上Glide.with(context.getApplicationContext()).resumeRequests()
我們專案是在Recyclerview的滑動監聽中判斷是否滑動來決定是否啟動Glide載入:

 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

                switch (newState) {
                    case 0:
                        startGlide(true);
                        break;
                    case 1:
                        startGlide(true);
                        break;
                    case 2:
                        startGlide(false);
                        break;
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

            }
        });

我們在Recyclerview中的滑動事件中進行監聽,當暫停和拖拽滑動時開啟Glide載入圖片,當滑動後自然沉降狀態時停止Glide,其中startGlide()中的程式碼是:

    private boolean mAlreadyStart = true;//是否已經開啟Glide載入圖片
    private void startGlide(boolean start) {
        if (mAlreadyStart) {
            if (start) {
                return;
            }
            mAlreadyStart = false;
                   Glide.with(Context.getApplicationContext()).pauseRequests();
        } else {
            if (!start) {
                return;
            }
            mAlreadyStart = true;
            Glide.with(Context.getApplicationContext()).resumeRequests();
        }
    }

這裡就解決了我專案中的問題,還可以實現在滑動時載入圖片不滑動就不載入圖片,也可以很好的避免不必要的載入。
有什麼問題也可以留言提問哈。歡迎各位看官留言提出意見,謝啦。

相關推薦

Glide載入圖片Recyclerview有時候顯示佔位的問題

1、IllegalArgumentException: You cannot start a load for a destroyed activity @TargetApi(Build.VERSION_CODES.JELLY_BEAN_M

Recyclerview 列表 使用Glide載入圖片,下拉 或者上拉 載入資料,圖片閃 爍 ,

剛開始以為是 Recyclerview的快取複用問題,隨找了幾個方法試試,在Recyclerview adapter裡邊 設定tag,,然並卵; 禁止 glide 預設載入動畫,沒卵用,並沒有解決,

RecycleView 使用glide載入圖片如何防止載入錯亂

RecycleView和ListView類似,當滑動過程中利用子執行緒載入圖片,由於其內部viewHolder的複用機制,會導致載入圖片錯亂問題,ListView可以通過設定tag解決,但是如果用glide載入圖片,由於Glide內部已經使用了setTag的方式, 如果再使用ImageV

列表Glide載入圖片大小顯示不正常問題

Glide載入圖片時大時小 前言:最近在專案中發現了一個奇怪的現象,在列表的item佈局中使用了glide來載入網路圖片,奇怪的現象出現了…同一張圖,同一份資料,有的時候顯示正常,有的時候該圖片顯示出來會稍微小一圈… 解決辦法:百思不得其解,找了很多資料,以為對recyclervie

Glide、Picasso框架載入圖片——ImageView、ListView

新增許可權 <uses-permission android:name="android.permission.INTERNET"/> //引入glide compile 'com.github.bumptech.glide:glide:3.7.0' //

Android框架之路——Glide載入圖片(結合RecyclerView、CardView)

Android框架之路——Glide載入圖片 一、簡介: 在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會

RecyclerView Glide載入圖片重新整理時會閃一下

@Override     protected void convert(BaseViewHolder helper, GameListResp.Data data) {           LinearLayout ic_linearLayout = (LinearLayo

在GridView或者ListView的Adapter使用Glide載入圖片圖片被拉伸問題

這個問題來自我的一篇部落格為什麼圖片載入我首先Glide 一位網友的評論,我測試了下,還真有,但是要根據圖片而定,有些圖片一點點的拉伸也看不出來,若原圖片有正圓或者正方形的圖案偶爾會顯示出橢圓或長方形有些明顯。 那這個問題的根源是什麼呢?為什麼顯示單張圖片沒有影響,放

Android Glide 載入圖片

0.借鑑文章地址:http://blog.csdn.net/zivensonice/article/details/51835802 和 http://www.cnblogs.com/zhaoyanjun/p/5404162.html 1.導包:compile 'com.github.bumptech.gl

新版Glide載入圖片時,佔位符placeholder失效的解決方案

我使用的是當前最新的Glide4.8.0的版本,想要設定在載入圖片過程中顯示預設圖片的功能,網上查到的設定placeholder,但實際發現這個屬性爆紅無法使用。 解決方案: Glide .with(this) .load(PHOTO_URL) .apply(new Request

listview載入圖片過程圖片載入不一致原理。

//主介面佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com

Recyclerview多條Editext,並新增,刪除item

先說一下需求:需要新增多輛車的資訊,車輛數無上限,預設顯示一個空的車輛資訊,可進行增,刪操作,刪除時又可全部刪除!先上效果圖   CompileCarActivity.class 的xml佈局 <RelativeLayout android:layout_width=

RecyclerViewEditText時,設定TextWatcher發生錯亂問題

RecyclerView中有EditText時,設定TextWatcher發生錯亂問題 解決辦法: 在Adapter裡面的onBindViewHolder方法裡面先移除當前item中EditText的TextWatcher; if (holder.editTex

Glide載入圖片並儲存到本地返回file,bitmap

不廢話,直接上程式碼 [java] view plain copy print?import android.content.Context;  import android.content.Intent;  import android.graphics.Bitmap;  import androi

Glide載入圖片並儲存到本地相簿

不廢話,直接上程式碼 import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; impor

使用Glide載入圖片

載入網路圖片 1、匯入Glide庫和V4包,因為Glide依賴於V4 ImageView targetImageView = (ImageView) findViewById(R.id.im

Glide 載入圖片儲存至本地,載入回撥監聽

Glide 載入圖片儲存至本地指定路徑/** * Glide 載入圖片儲存到本地 * * imgUrl 圖片地址 * imgName 圖片名稱 */ Glide.with(context).load(im

GLide載入圖片還能這樣幹——基於Glide4.0完美封裝

一個基於GLide載入圖片的封裝開源框架。可以監聽載入圖片時的進度 ,可以設定圖片的圓角、邊框。可載入成圓形。 該庫是基於Glide V4.0設計的,實現如下特性: 1、通過提供的屬性可以設定圖片的圓角、邊框。 2、可以設定點選觸控圖片時的顏色、透

Glide載入圖片,GONE無法隱藏

Glide載入圖片的過程中使用了動畫,ImageView設定動畫之後無法隱藏,所以,使用Glide載入圖片dontAnimate()去掉動畫 Glide.with(DealerDynamicActivity.this).load(file)

Android Glide載入圖片時轉換為圓形、圓角、毛玻璃等圖片效果

Android Glide載入圖片時轉換為圓形、圓角、毛玻璃等圖片效果 附錄1簡單介紹了Android開源的圖片載入框架。在實際的開發中,雖然Glide解決了快速載入圖片的問題,但還有一個問題懸而未決:比如使用者的頭像,往往使用者的頭像是從伺服器端讀出的一個普通矩形圖片