使用Glide库渲染的图片不正确。

13

我在我的Android项目中使用Glide库来获取和显示图像。早先我使用的是2.0.5版本,遇到了渲染问题。问题是错误的图像被渲染出来了。我已经将库更新到3.3版本,但现在它会崩溃并显示以下异常。

14-Sep-2014 08:41:31 PM java.lang.IllegalArgumentException: 
You cannot start a load for a destroyed activity
    at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:63)
    at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:29)
    at com.bumptech.glide.Glide.with(Glide.java:537)
    at com.miamiheat.common.MHImageDownloadWrapper.loadImage(MHImageDownloadWrapper.java:12)
    at com.miamiheat.ui.module.MHWallpaperModule.setWallpaperViewData(MHWallpaperModule.java:234)
    at com.miamiheat.ui.module.MHWallpaperModule.taskManagerResponseCallback(MHWallpaperModule.java:257)
    at com.miamiheat.service.taskmanager.MHWallpaperTaskManager.asyncResultCallback(MHWallpaperTaskManager.java:133)
    at com.miamiheat.service.framework.MHAsyncServiceTask.onPostExecute(MHAsyncServiceTask.java:191)
    at android.os.AsyncTask.finish(AsyncTask.java:631)
    at android.os.AsyncTask.access$600(AsyncTask.java:177)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:176)
    at android.app.ActivityThread.main(ActivityThread.java:5419)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
    at dalvik.system.NativeStart.main(Native Method)

有没有办法在 Activity 销毁时取消图片下载请求?


我已经解决了使用Picasso而不是Glide的问题。请查看这里 - Stephen
5个回答

7

Glide.clear()对我来说有时候没有帮助。使用getApplicationContext()方法将应用程序上下文传递给Glide.with(...)。


在我的情况下,是关于屏幕旋转的问题。你的建议对我很有帮助。谢谢。 - Sermilion

4
您可以始终使用Glide.clear()来取消加载。
然而,当您尝试在活动被销毁后启动新的加载时,会出现该异常。您是在异步获取数据后开始加载图像吗?如果是,那么当您的活动停止时,您可能希望取消异步获取,或者至少在获取完成且活动已销毁时忽略结果。

嗨,我正在使用Glide.with(context)。load(imageUrl)。animate(R.anim.fade_in)。into(imageView);来加载图像。它通过列表适配器加载到列表项布局中。 - Manish
在 Glide v4 中,它是:Glide.with(fragment).clear(target)(请参见迁移指南 - Incinerator

3

您需要在onDestroy()onDestroyView()方法中调用Glide.with(getActivity()).pauseRequests()Glide.get(getActivity()).clearMemory(),只需将其删除即可。


注:该段内容涉及IT技术。

0

确保在 onBindViewHolder 方法的开头清除你的 view。 就这些。

@Override
public void onBindViewHolder(final Adapter_Feed_Msg.ViewHolder holder, final int position) {

    Glide.with(mContext).clear(holder.ProfileImage);
    Glide.with(mContext).clear(holder.postImage);

 .
 .
 .
}

0

在 Glade 调用之前添加这个

if(!this.isDestroyed()){
   Glide.with(activity).load(...)
   ....
}

虽然这段代码可能回答了问题,但是提供关于它如何和/或为什么解决问题的额外背景信息,将会提高该回答的长期价值。请记住,你是为未来的读者回答问题,而不仅仅是现在提问的人!请编辑你的回答以添加解释,并指出哪些限制和假设适用。同时也可以提及一下为什么这个答案比其他答案更加合适。 - Dev-iL

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