2017-02-24 118 views
0

我建了一个自定义视图,并在其构造我做postDelay()利用滑行来更新的ImageViewgetHandler()。removeCallbacksAndMessages(空)不工作

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

并且如果用户单击后退并且活动被破坏,Glide会崩溃应用程序(Glide检查活动是否仍然有效) 我将清理处理程序中的所有消息。

所以在onDetachedFromWindow()方法:

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

但问题是,即使我很快就点击后退按钮(1-2秒)我postDelay()还是被解雇了可运行的。

有什么理由?

感谢

+0

只需使用[Glide.clear()](http://bumptech.github.io/glide/javadocs/331/com/bumptech/glide/Glide的.html#清除(android.view.View))。 – azizbekian

回答

1

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