针对我的代码推出新Lint。它提出了许多好的建议,但这个我无法理解。
DrawAllocation:
绘图代码中的内存分配
说明:
在绘图代码中查找内存分配。 您应该避免在绘图或布局操作期间分配对象。这些是经常调用的,因此可以通过对象分配引起的垃圾收集暂停来中断平滑的UI。
通常处理这种方法的方法是预先分配所需的对象,并为每次绘图操作重复使用它们。
有些方法代表您分配内存(例如Bitmap.create),这些方法应该以相同的方式处理。
有人能帮我解决这个问题吗? 对代码示例的解释更加友好。
答案 0 :(得分:1)
当您在经常调用的方法中分配内存以在屏幕上绘制内容时,会出现此Lint警告。通过预先分配内存可以避免分配和释放内存,从而提高性能。
代码示例。例如,我们有一些扩展View
的类。我们覆盖其onDraw()
方法:
@Override
protected void onDraw(Canvas canvas) {
// following line allocates memory - really bad place for that
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
canvas.drawBitmap(bitmap, 100, 100, null);
}
我们只想显示一些位图。但是,每次调用onDraw()
(经常发生)时,都会创建新的位图并分配内存。执行onDraw()
后,此内存可能也会被释放。所以,Lint会在这里给我们一个有用的警告,这是一个性能问题。
我们可以做得更好:
private Bitmap bitmap;
public OurView(Context context) {
super(context);
// pre-allocate bitmap so we can use it later
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
}
@Override
protected void onDraw(Canvas canvas) {
// much faster - no allocation/deallocation of bitmap
canvas.drawBitmap(bitmap, 100, 100, null);
}