/**
* This is called when the view is detached from a window. At this point it
* no longer has a surface for drawing.
*
* @see #onAttachedToWindow()
*/
protected void onDetachedFromWindow() {
//已經從窗口
mPrivateFlags &= ~PFLAG_CANCEL_NEXT_UP_EVENT;
mPrivateFlags3 &= ~PFLAG3_IS_LAID_OUT;
removeUnsetPressCallback();
removeLongPressCallback();
removePerformClickCallback();
removeSendViewScrolledAccessibilityEventCallback();
destroyDrawingCache();
destroyLayer(false);
cleanupDraw();
mCurrentAnimation = null;
}
021.關於自定義View
1.讓View支持wrap_content
這是因爲直接繼承View或者ViewGroup的控件,如果不在onMeasure中對wrap_content做特殊處理。那麼當外界在佈局中使用wrap_content時就無法達到預期的結果。
2.如果有必要,讓自定義的View支持padding,充分考慮margin和padding對ViewGroup的影響
這是因爲直接繼承View的控件,如果不在draw方法中處理padding,那麼padding屬性是無法起作用的。另外,直接繼承自ViewGroup的控件需要在onMeasure和onLayout中考慮padding和子元素的margin對它造成的影響,不然會導致padding和子元素的margin不起作用。
3.沒必要在View中使用handler
這裏不是說不能使用handler,而是,基本上沒有必要在View中去創建一個新的handler對象,因爲View本身有post方法。不過,我們對用handler實現回調也不反對的。
4.View中如果有線程或者動畫,需要及時停止,參考下View#onDetachedFromWindow
在這邊介紹一下onDetachedFromWindow 這個方法,onDetachedFromWindow 和onAttachedToWindow 是對應的,onDetachedFromWindow 在View在destroy
view的時候調用,所以可以加入取消廣播註冊等的操作。下面是View的onDetachedFromWindow方法:
所以,在這個方法中,我們需要把線程、動畫停止,同時釋放一些資源,如果不及時處理,是有可能造成內存泄露的。比如,我們的View有對象引用,但是那個View已經從窗體分離了,那個Activity已經消失了,這時候,還是有可能因爲View在其他Activity有引用,導致這個View的對象沒有被回收,造成內存泄露。
5.View帶有滑動嵌套情形時候,需要處理好滑動衝突。
如果有滑動衝突,我們需要合適地去處理滑動衝突,否則會導致View不能正常處理滑動事件,導致我們想要的效果達成不了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.