Android Studio中Fragment内使用Glide生成视频缩略图的正确方式
Fragment中用Glide生成视频缩略图的正确姿势
你遇到的问题是因为onCreateView()阶段Fragment还没完全和Activity绑定,直接传this(Fragment实例)会让Glide拿不到有效的生命周期上下文,导致加载失败。
给你几个靠谱的解决方法:
用布局View的上下文:在
onCreateView()里inflate完布局后,直接用view.getContext()当Glide的上下文,这是最稳妥的:@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.your_fragment_layout, container, false); Glide.with(view.getContext()) .asBitmap() .load(uri) .into(new CustomTarget<Bitmap>() { @Override public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { bitmapThumbnail = resource; // 拿到Bitmap后就可以传给其他Fragment了 } @Override public void onLoadCleared(@Nullable Drawable placeholder) { // 这里可以做资源清理,防止内存泄漏 } }); return view; }用Activity上下文:等Fragment完全绑定Activity后,比如在
onActivityCreated()方法里,用requireActivity()(强制获取Activity,避免空指针):@Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Glide.with(requireActivity()) .asBitmap() .load(uri) .into(new CustomTarget<Bitmap>() { @Override public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { bitmapThumbnail = resource; } @Override public void onLoadCleared(@Nullable Drawable placeholder) { // 清理资源 } }); }
另外提醒一句:你之前用的SimpleTarget已经过时了,Glide 4.x之后推荐用CustomTarget,能更好地处理资源回收,减少内存泄漏风险。
最后,要是要把Bitmap传给其他Fragment,建议用ViewModel或者接口回调的方式,别直接存大对象,容易占内存。
内容的提问来源于stack exchange,提问作者Samy Sylvester
相关产品推荐
相关产品推荐

