android - 为什么重新启动活动时 Glide 会抛出“IllegalArgumentException”?
问题描述
我正在使用 Glide 在我的 android 应用程序中从互联网加载图像。当用户单击注销按钮时,我通过清除所有共享首选项并使用以下代码重新启动应用程序来注销用户:
Intent i = getActivity().getBaseContext().getPackageManager().getLaunchIntentForPackage( getActivity().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
getActivity().finish();
并且注销工作正常。但是,当用户再次登录时,我的应用程序崩溃了。
这是日志详细信息:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.highavenue.android, PID: 21503
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.highavenue.android.adapter.ActivityTimelineAdapter.onBindViewHolder(ActivityTimelineAdapter.java:181)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
代码:(我在哪里以及如何使用 Glide)
Glide.with(context)
.load(users_list.get(user_position).getProfileImageURL())
.thumbnail(0.1f)
.override(100, 100)
.into(holder.profile_image);
上面的代码在 RecyclerViewAdapter 类中使用,其中 context 是指片段的上下文。
注意:当用户手动关闭应用并再次打开时,不会出现此异常。
解决方案
错误告诉你问题:
java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
因此,在您调用finish()
Activity 之后,您的 Glide 加载调用正在执行。
完成 Activity 后,您需要防止调用 Glide 加载方法。
给定您当前的代码,您可以设置一个标志或其他东西来告诉适配器不加载图像:
mAdapter.disableImageLoading(); // Set a flag that internally prevents the Glide load from happening
Intent i = getActivity().getBaseContext().getPackageManager().getLaunchIntentForPackage( getActivity().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
getActivity().finish();
这不是最好的解决方案,但鉴于我对您的代码知之甚少,我能想到的最好的解决方案。
希望有帮助!
推荐阅读
- javascript - Sequelize:如何更新关联?
- laravel - 奇怪的 Laravel 7 数据库缓存
- c# - Tweetinvi authenticationContext 返回 null
- sqlite - 如何在sqlite中表示大数字
- webrtc - 如何调试ICE Candidate的选择?
- stored-procedures - 是否可以从 tableau 运行大查询存储过程?
- python - Numpy shared_memory 数组在池内重置为零
- python - 使用 Python 使用 POST 请求登录网站
- typescript - Angular 10 Web worker 不在生产环境中工作,但在 developermnet 中工作
- azure-resource-manager - 如何使用 ARM 模板在管理组下移动订阅?