首页 > 解决方案 > 为什么重新启动活动时 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 是指片段的上下文。

注意:当用户手动关闭应用并再次打开时,不会出现此异常。

标签: androidandroid-activityandroid-contextandroid-glide

解决方案


错误告诉你问题:

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();

这不是最好的解决方案,但鉴于我对您的代码知之甚少,我能想到的最好的解决方案。

希望有帮助!


推荐阅读