gpt4 book ai didi

java - getHandler().removeCallbacksAndMessages(null) 在自定义 View 中不起作用

转载 作者:行者123 更新时间:2023-12-01 08:50:24 27 4
gpt4 key购买 nike

我构建了一个自定义 View ,并在其构造函数中使用 postDelay() 使用 glide 更新 ImageView

postDelayed(new Runnable() {
@Override
public void run() {
Glide.with(getContext())
.load("url").asBitmap()
.into(new SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
Drawable drawable = new BitmapDrawable(resource);
setBackground(drawable);
}
});
}
},5000);

如果用户点击返回并且 Activity 被破坏,那么 Glide 将使应用程序崩溃(Glide 检查 Activity 是否仍然有效)我将清理处理程序中的所有消息。

所以在 onDetachedFromWindow() 方法中:

 @Override
protected void onDetachedFromWindow() {
getHandler().removeCallbacksAndMessages(null);
super.onDetachedFromWindow();
}

但问题是即使我快速单击后退按钮(1 -2 秒),我 postDelay() 仍然会被解雇。

有什么理由吗?

谢谢

最佳答案

View#postDelayed 的来源:

public boolean  postDelayed(Runnable action, long delayMillis) {  
final AttachInfo attachInfo = mAttachInfo;

if (attachInfo != null) {
return attachInfo.mHandler.postDelayed(action, delayMillis);
}

// Assume that post will succeed later
ViewRootImpl.getRunQueue().postDelayed(action, delayMillis);
return true;
}

AttachInfo 是在构造函数之后发生的 dispatchAttachedToWindow 上分配的。这意味着构造函数中的任务被分配给 ViewRoot 运行队列。在 onDetachedFromWindow 上,您只是尝试从错误的队列中删除。

解决方案 - 只需将此 postDelayed 调用移至 onAttachedToWindow()

关于java - getHandler().removeCallbacksAndMessages(null) 在自定义 View 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42433075/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com