重新打开时的Glide问题 + 无法从销毁的活动中加载

3
我一直在适配器中使用Glide,将上下文从Activity类传递到我的Fragment中(视图在Fragment中)。我检查了大约30个设备,在3-5个设备上,当用户尝试在关闭后重新启动应用程序时,应用程序会崩溃。可能的原因是什么,如何处理此异常? 我不想在Glide中使用Applicationcontext,因为这会保留glide资源。有没有其他解决方法?
Logcat
java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134)
at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:102)
at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:87)
at com.bumptech.glide.Glide.with(Glide.java:629)
at com.trial.project.Adapter.LiveUserListAdapterInside.onBindViewHolder(LiveUserListAdapterInside.java:68)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6356)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6389)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5335)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5598)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3312)
at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1618)

以下是glide加载的代码:
Glide.with(itemHolder.ImageView.getContext())
    .load( current.getPhotoUrl() )
    .bitmapTransform(new CropCircleTransformation(context))
    .placeholder(R.drawable.x2)
    .into(itemHolder.friendImageView);

以下是OnBackPressed()函数的代码:
    // ... ...
      ... ..
    finishAffinity();

请添加 logcat。 - IntelliJ Amiya
请发布您遇到的错误。 - Sharath kumar
很不幸,我没有那些设备的具体日志,我们的官方测试设备也无法重新创建此错误,但类似以下内容的错误发生在Glide.load的行中... java.lang.IllegalArgumentException: 你不能为一个已销毁的活动开始加载 - user232803
我已经在IntelliJAmiya中添加了logcat。 - user232803
请检查现在 @匿名 - user232803
@user232803,是的,我明白了问题。我已经发布了解决方案。你的活动在图像加载时往往会被销毁。 - Sharath kumar
2个回答

1
每当您尝试加载图像时,我猜测活动将处于销毁状态。这是在您尝试加载图像并在加载之前移动到不同的活动时发生的。因此,请进行空值检查以查看活动是否仍然存在,并且图像引用是否存在。
此外,请使用itemHolder.friendImageView.getContext()替换itemHolder.ImageView.getContext()。
检查此编辑后的代码以加载图像。
 if(!this.isDestroyed() && friendImageView!=null && current.getPhotoUrl()!=null){
        Glide.with(itemHolder.friendImageView.getContext())
                .load( current.getPhotoUrl())
                .bitmapTransform(new CropCircleTransformation(context))
                .placeholder(R.drawable.x2)
                .into(itemHolder.friendImageView);  
    }

我对这个 'itemHolder.ImageView.getContext() with itemHolder.ImageView.getContext()' 不是很清楚。虽然会检查是否为空。 - user232803
抱歉,它是friendImageView。这个上下文会创建nullPointerexception。要么使用它,要么使用getApplicationContext()。 - Sharath kumar
如果 "!this.isDestroying()" 不起作用的话,"!this.isFinishing()" 应该可以解决你的问题。 - Sharath kumar

0

使用 Glide 加载图片时,始终使用 Activity context

在使用 Glide 与 adapters 时,可以通过在 adapter 的构造函数中使用 Glide.with(this)RequestManager 对象从活动本身传递。

在开始 Glide 加载之前,检查 activity/fragment 是否可见总是安全的。

因此,对于 Activity:

if(!this.isFinishing()){
   // Initialise Glide here
}

对于 Fragment:

MyFragmentClass mFragment = (MyFragmentClass) getSupportFragmentManager().findFragmentByTag("testID");
if (mFragment != null && mFragment.isVisible()) {
     // Initialise Glide here
}

参考: https://android.jlelse.eu/using-glide-few-tips-to-be-a-pro-60f41e29d30a


如何处理RecyclerViewAdapter? - roghayeh hosseini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接