2017-02-24 119 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()