網絡上有很多解決的辦法,但是都是在清理磁盤緩存和內存上做,並不能及時釋放內存。
1.可以在每次請求數據和加載數據后調用
/** * 清除內存緩存. */
public static void clearMemoryCache(Context context){
// This method must be called on the main thread.
System.gc();
// Glide.get(context).clearMemory();
GlideApp.get(context).clearMemory();
}
/** * 清除磁盤緩存.必須在子線程里做 */
public static void clearDiskCache(Context context){
System.gc();
new AsyncTask<Void,Void,Void>(){
@Override protected Void doInBackground(Void... params) {
// This method must be called on a background thread.
GlideApp.get(context).clearMemory();
// Glide.get(context).clearDiskCache(); return null; }
};
}
2.可以設置磁盤緩存的大小
@GlideModule
public final class MyGlideModule extends AppGlideModule {
/** * MemorySizeCalculator類通過考慮設備給定的可用內存和屏幕大小想出合理的默認大小. * 通過LruResourceCache進行緩存。 * @param context * @param builder */
@Override
public void applyOptions(Context context, GlideBuilder builder) {
/*MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context) .setMemoryCacheScreens(2) .build();
builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));*/
int diskCacheSizeBytes = 1024 * 1024 * 500; // 100 MB
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
}
@Override
public boolean isManifestParsingEnabled() {
return false;
}
}
3.以下是盡量減少圖片資源的大小
GlideApp.with(context).asDrawable().load(url)).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).apply(MyUtils.gildeOptions()).into(imageView);
(1)相對而言,asDrawable()比asBitmap要省(具體相關可以去百度)
(2).skipMemoryCache(true)跳過內存緩存。
(3).diskCacheStrategy(DiskCacheStrategy.ALL)全部使用磁盤緩存
(4)裁剪圖片大小.override(200,200);下面是具體使用方法
public static RequestOptions gildeOptions(){
RequestOptions options = new RequestOptions();
options.fitCenter() .placeholder(R.drawable.default_head) .error(R.drawable.default_head) .fallback(R.drawable.default_head).override(200,200);
return options;
}
以上是網絡上學習的方法,但是還是會出現OOM,下面是我自己處理的,效果很明顯,希望能幫到大家。
在Recyclerview中重寫這個方法,當item被隱藏的時候,調用 Glide.with(fragment).clear(imageView);
@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
super.onViewRecycled(holder);
ImageView imageView=holder.imageView;
if (imageView!=null){
Glide.with(context).clear(imageView);
}
}