在上述代码中,Glide 加载图片所占用的内存是通过 CustomTarget
的 onResourceReady
方法返回的 Drawable
对象来表示的。因此,在 onViewRecycled
方法中,我们可以通过将 Drawable
对象的引用置为 null
来释放所占用的内存。
具体来说,我们可以将 CustomTarget
对象声明为 ViewHolder 的成员变量,并在 onViewRecycled
方法中将其引用置为 null
,以释放 Drawable
所占用的内存。例如:
public class MyViewHolder extends RecyclerView.ViewHolder {private LinearLayout linearLayout;private CustomTarget<Drawable> customTarget;public MyViewHolder(View itemView) {super(itemView);linearLayout = itemView.findViewById(R.id.linear_layout);}public void onBindViewHolder(MyData data) {customTarget = new CustomTarget<Drawable>() {@Overridepublic void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {// Do something with the Drawable herelinearLayout.setBackground(resource);}@Overridepublic void onLoadCleared(@Nullable Drawable placeholder) {// 从任何视图中删除onResourceReady中提供的Drawable,并确保不保留对它的引用。}};Glide.with(itemView.getContext()).load(R.drawable.access).diskCacheStrategy(DiskCacheStrategy.ALL).into(customTarget);}@Overridepublic void onViewRecycled() {super.onViewRecycled();// 在 onViewRecycled 中释放 CustomTarget 所占用的内存customTarget = null;}
}
在上述代码中,我们在 MyViewHolder
中声明了一个 customTarget
成员变量,并在 onBindViewHolder
方法中使用它来加载图片。在 onViewRecycled
方法中,我们通过将 customTarget
的引用置为 null
来释放 Drawable
所占用的内存。
需要注意的是,如果我们在加载图片时使用了一些特殊的设置,例如调整图片尺寸、缩放类型等,那么在释放内存时也需要相应地进行清理,以避免内存泄漏的问题。例如,如果我们在加载图片时使用了 override
方法来调整图片尺寸,那么在释放内存时也需要将相应的参数传入 CustomTarget
对象中,以确保内存被正确释放。例如:
public class MyViewHolder extends RecyclerView.ViewHolder {private LinearLayout linearLayout;private CustomTarget<Drawable> customTarget;public MyViewHolder(View itemView) {super(itemView);linearLayout = itemView.findViewById(R.id.linear_layout);}public void onBindViewHolder(MyData data) {customTarget = new CustomTarget<Drawable>() {@Overridepublic void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {// Do something with the Drawable herelinearLayout.setBackground(resource);}@Overridepublic void onLoadCleared(@Nullable Drawable placeholder) {// 从任何视图中删除onResourceReady中提供的Drawable,并确保不保留对它的引用。}};Glide.with(itemView.getContext()).load(R.drawable.access).override(200, 200).diskCacheStrategy(DiskCacheStrategy.ALL).into(customTarget);}@Overridepublic void onViewRecycled() {super.onViewRecycled();// 在 onViewRecycled 中释放 CustomTarget 所占用的内存,并传入相应的 override 参数customTarget = null;}
}
总之,在 onViewRecycled
方法中释放 Glide 加载图片所占用的内存,我们需要将 CustomTarget
对象的引用置为 null
,以释放 Drawable
所占用的内存。如果在加载图片时使用了一些特殊的设置,例如调整图片尺寸、缩放类型等,那么在释放内存时也需要相应地进行清理,以避免内存泄漏的问题。