【Code-Snippet】自定義View

1. 硬件加速致使的自定義drawable的內存泄漏

摘自:硬件加速致使的自定義drawable的內存泄漏android

緣由
  • 在用canvas繪製圖片時,若是對同一個view繪製屢次,會使native內存不斷增加,native裏內存不能釋放,通過排查,最後發現是默認使用硬件加速致使的
  • 若自定義View中,有複雜的Path,儘管每次的使用都是同一個對象,Path.reset(),這些繪製都會用到紋理的遮罩。每當你建立或者修改一個path,硬件渲染過程都會建立一個新的遮罩,這耗費的代價是至關大的。從內存快照上看,每一次的修改或者從新繪製或者從新開啓動畫,Native層都會多出一大截內存,其是byte[]的急劇增長。
  • 每當修改一次bitmap的內容,(用canvas繪製最後仍是會獲得bitmap)當你下次再繪製它的時候都會以GPU的紋理形式上傳一次。多是這些致使native內存的增長
解決
  • 關閉硬件加速便可。

Application級別canvas

或者禁用如下級別的硬件加速:Application Activity Window 和 View 。
在你的Android Manifest文件中添加 屬性標記,以便爲整個應用程序使用硬件加速。
複製代碼

Activity級別bash

若是你的應用程序不能在Application應用級別表現良好的話,則可使用對Activity進行單獨控制。
要啓動或者禁用一個Activity的硬件加速,你可使用activity的android:hardwareAccelerated屬
性。下面的一個列子使整個Application啓用硬件加速,可是對一個Activity禁止使用硬件加速。
複製代碼

Window級別動畫

  • 若是你須要更細粒度的控制,你能夠經過以下代碼給window進行加速。
getWindow().setFlags( 
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, 
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 
複製代碼

View級別spa

  • 咱們能夠對單獨的View在運行時階段禁用硬件加速。咱們可使用以下代碼:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
複製代碼
相關文章
相關標籤/搜索