不能使用下滑来启动相对布局图像中已破坏活动的加载

我使用相对布局来设置一个图像。为什么我没有使用图像视图意味着,在相对布局图像,我设置图标。

我不知道到底是什么问题在下滑。我已经张贴了堆栈跟踪和相关代码如下:

Logcat:

 FATAL EXCEPTION: main
Process: com.app.steve, PID: 15928
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.Glide.with(Glide.java:644)
at com.app.steve.TabMorePagesDetailActivity$allPageDetails.onPostExecute(TabMorePagesDetailActivity.java:1050)
at com.app.steve.TabMorePagesDetailActivity$allPageDetails.onPostExecute(TabMorePagesDetailActivity.java:885)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

TabMorePagesDetailActivity.java:

RelativeLayout rlPageCoverImg;


rlPageCoverImg = (RelativeLayout)findViewById(R.id.rl_club_cover_img);


@Override
protected void onPostExecute(String response) {
super.onPostExecute(response);


dialog.dismiss();
............


String coverIMGurl = cover_avatar_obj.getString("url");


Log.e("ImgURL", coverIMGurl);


Glide.with(TabMorePagesDetailActivity.this).load(coverIMGurl).asBitmap().signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
.into(new SimpleTarget<Bitmap>(500, 500) {


@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
Drawable drawable = new BitmapDrawable(getResources(), resource);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
rlPageCoverImg.setBackground(drawable);
}
}
});


}else {


rlPageCoverImg.setBackgroundResource(R.drawable.bg_golive);


}






@Override
protected void onDestroy()
{
super.onDestroy();
Glide.clear(rlPageCoverImg);


}

Xml:

 <RelativeLayout
android:id="@+id/rl_club_cover_img"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@drawable/cancel_image" >


// Inside this relativelayout image, I'm using buttons and icons




</RelativeLayout>
54828 次浏览

用途:

Glide.with(getApplicationContext()).load(...)

而不是:

Glide.with(TabMorePagesDetailActivity.this).load(...)

希望它能解决你的问题 ~

注意 : 如果您决定使用 applicationContext,请参阅 使用应用程序上下文滑动图像加载

前几天我也遇到了同样的问题。我已经解决了这个问题,代表当前 Class 上下文内存传递了 Application 上下文内存。

也许它会帮助你:-

用这个密码

 Glide.with(getApplicationContext())
.load(coverIMGurl)
.asBitmap()
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
.into(new SimpleTarget<Bitmap>(500, 500) {....}

即使你得到这个问题,然后仔细阅读这篇文章“ https://github.com/bumptech/glide/issues/1097

这个问题的概述: 这是 Glide 库的一个问题。

在用 Glide 加载你的图像之前试试这个,在我的例子中 mireference 是一个 StorageReference,miimage 是一个 ImageView。我用这个解决了这个问题。我希望这能帮到你。

if (!this.isFinishing ()) {
// Load the image using Glide
Glide.with(YourActivity.this)
.using(new FirebaseImageLoader())
.load(mirefer)
.into(miimagen);
}

您可以简单地检查上下文是否被销毁,或者不用手动操作;

if (context == null) {
return
} else if (context !is Application) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
if (context is FragmentActivity) {
if ((context as FragmentActivity).isDestroyed) {
return
}
} else if (context is Activity) {
if ((context as Activity).isDestroyed) {
return
}
}
}
}

这也可以表示为一个 Kotlin 扩展函数:

/**
* Return true if this [Context] is available.
* Availability is defined as the following:
* + [Context] is not null
* + [Context] is not destroyed (tested with [FragmentActivity.isDestroyed] or [Activity.isDestroyed])
*/
fun Context?.isAvailable(): Boolean {
if (this == null) {
return false
} else if (this !is Application) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
if (this is FragmentActivity) {
return !this.isDestroyed
} else if (this is Activity) {
return !this.isDestroyed
}
}
}
return true
}

使用具有正确生命周期的参数安装 Glide。例如: 在自定义视图中使用 Glide.with(this)而不是 Glide.with(getContext())

另一种方法是检查活动是否被销毁,然后加载到 UI 元素中。

if (!newActivty.isDestroyed()){
...
}

在活动中,我使用 Glide.with(getApplicatonContext())和 在适配器中,我使用 < strong > Glide.with(myContext.getApplicatonContext())

//It works for me fine.


//for adapter


Context myContext;


//also initilize in `oncreateViewHolder`


@Override
public MessagesHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_messages_layout, parent, false);
myContext = parent.getContext();
return new MessagesHolder(view);
}

灵感来自 GitHub 线,我在加载任何图像之前使用它

final Context  context = getApplication().getApplicationContext();


if (isValidContextForGlide(context)){
// Load image via Glide lib using context
               

}


public static boolean isValidContextForGlide(final Context context) {
if (context == null) {
return false;
}
if (context instanceof Activity) {
final Activity activity = (Activity) context;
if (activity.isDestroyed() || activity.isFinishing()) {
return false;
}
}
return true;
}

请不要使用 Glide.with(getApplicationContext()),除非你真的需要,原因在这里讨论: 使用应用程序上下文滑动图像加载

正确答案如下: Https://github.com/bumptech/glide/issues/1484#issuecomment-365625087

在 Kotlin,这可以写成一个扩展函数:

fun Context.isValidGlideContext() = this !is Activity || (!this.isDestroyed && !this.isFinishing)

框架模型 即使在按下后退按钮并退出程序时,活动上下文也保持不变。 然后回到程序中,您不需要重新评估上下文,因为上下文是静态的

@Override
public void onBindViewHolder(@NonNull final viewholder viewholder, final int i) {
final Model_Post model_post = list.get(i);
Log.e(TAG, "onBindViewHolder: "+model_post.getImageurl());


Glide.with(MainActivity.activity)
.load(Uri.parse(model_post.getImageurl()))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(viewholder.itemsPostBinding.imgvItempost);


}

你必须在主要活动中这样做:

public static AppCompatActivity activity;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity = MainActivity.this;
}

请使用 Glide.with (holder.itemView.getContext ()) . load... ... 。 它解决了我的 https://github.com/bumptech/glide/issues/2690

下面是 Kotlin 的一个扩展,它将上面的几个答案—— 这个这个这个放在一起:

/**
* Returns true when [Context] is unavailable or is about to become unavailable
*/
fun Context?.isDoomed(): Boolean = when (this) {
null -> true
is Application -> false
is Activity -> (this.isDestroyed or this.isFinishing)
else -> false
}

不要只在适配器中使用从活动中获取的上下文作为 context = this 而是使用 context.getApplicationContext () ;

只需使用这个 helper 类:

/**
* @Lukas Niessen
*/
public class GlideUsus {


public static final String TAG = "GlideUsus";


public interface Interface {
void doIfValidContext(RequestManager requestManager);
}


public static void execute(Context context, GlideUsus.Interface action) {
if (isValidContextForGlide(context)) {
action.doIfValidContext(Glide.with(context));
} else {
// nothing
Log.v(TAG, "Loading image failed");
}
}


public static boolean isValidContextForGlide(final Context context) {
if (context == null) {
return false;
}
if (context instanceof Activity) {
final Activity activity = (Activity) context;
if (activity.isDestroyed() || activity.isFinishing()) {
return false;
}
}
return true;
}
}

用法:

GlideUsus.execute(mContext, (a -> a.load(uri).into(image)));