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