getHandler().removeCallbacksAndMessages(null) 在自定义视图中不起作用
getHandler().removeCallbacksAndMessages(null) doesnt work in custom view
我构建了一个自定义视图,并在其构造函数中postDelay()
使用滑行更新图像视图
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();
}
但问题是我 postDelay()
即使我快速单击后退按钮(1 -2 秒)仍然被解雇的可运行程序。
有什么原因吗?
谢谢
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()
我构建了一个自定义视图,并在其构造函数中postDelay()
使用滑行更新图像视图
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();
}
但问题是我 postDelay()
即使我快速单击后退按钮(1 -2 秒)仍然被解雇的可运行程序。
有什么原因吗?
谢谢
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()