2017-02-24 24 views
0

私はカスタムビューを構築し、そのコンストラクタで、私はImageViewのgetHandler()。カスタムビューでremoveCallbacksAndMessages(ヌル)のdoesntの仕事

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

、ユーザーが戻ってクリックした場合のを更新するためにグライドを使用するpostDelay()を行いますアクティビティが破壊されたので、グライドがアプリをクラッシュさせます(グライドはアクティビティが有効かどうかを確認します) ハンドラ内のすべてのメッセージを消去します。 onDetachedFromWindow()方法で

ので:

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

しかし、問題は、私はすぐにボタン(1 -2秒)をバック]をクリックした場合でも、私はまだ解雇postDelay()た実行可能です。

何らかの理由がありますか?

感謝View#postDelayed

+0

このpostDelayedコールを移動.html#clear(android.view.View))。 – azizbekian

答えて

1

出典:

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では、間違ったキューから単に削除しようとしています。

溶液 - 単純に[Glide.clear()](http://bumptech.github.io/glide/javadocs/331/com/bumptech/glide/Glideを使用onAttachedToWindow()

関連する問題