2012-06-18 55 views
0

我已经在论坛和Google上进行了一些关于初始化和使用静态字段的搜索。但我不能修复它,所以这里是简化代码:使用静态字段时出错

... 
import android.graphics.Canvas; 
... 

public class MyActivity extends Activity{ 

... 
public static Canvas myCanvas = new Canvas(); 
public static float myMaxX; 
public static float myMaxY; 
... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    ... 
    myMaxX = myCanvas.getWidth(); // <=== Error, the app crashes right there 
    myMaxY = myCanvas.getHeight(); 
    ... 
    ... 

    } 
... 
} 

我错过了什么吗?

+4

你可以发布异常以及它的堆栈跟踪吗? – Attila

回答

1

是的!

您需要首先创建一个位图:

int w = WIDTH_PX, h = HEIGHT_PX; 

BitmapConfig conf = Bitmap.Config.ARGB_8888; // see other conf types 
Bitmap bmp = Bitmap.createBitmap(w, h, conf); // this creates a MUTABLE bitmap 
Canvas canvas = new Canvas(bmp); 

// ready to draw on that bitmap through that canvas 

但是,创造一个静态的帆布恶臭码味的。我不知道你想用它做什么,但我不认为会有什么好的结果。如果您在多个线程之间共享此画布,您可能会发现遇到大量并发读/写冲突问题。

+0

谢谢,它的工作(尽管我仍然不明白) 静态画布的原因是,我想画很多位图,而这些位图是在其他类中。我希望它们使用相同的Canvas属性,因此创建和初始化相同Canvas的许多副本将耗费大量时间。这就是为什么创建一个静态的更好,它使用更少的内存空间,并且时间更少。 – mhfff32

+1

查看文档 - http://developer.android.com/reference/android/graphics/Canvas.html - “Canvas类保存”绘制“调用。要绘制某些东西,需要4个基本组件:A用于保存像素的位图,用于承载绘制调用(写入位图)的Canvas,绘图基元(例如Rect,Path,文本,位图)和绘画(描述绘图的颜色和样式)。 – Martyn

-1

变量myCanvas在该点可能没有值。所以你必须检查一个空值。

myMaxX = (myCanvas != null)?myCanvas.getWidth():0; 
       // <=== check for null 
+0

为什么myCanvas还没有价值?它被初始化为静态字段。 – dj18

+0

我做了验证 'if(myCanvas == null){ Log.w(“myApp”,“myCanvas is null”); myMaxX = 0; } else { Log.w(“myApp”,“no it is not”); myMaxX = myCanvas.getWidth(); }' 调试显示它不为空。 – mhfff32

+0

@ dj8,它是静态的,但不是最终的,是不是可以在其他地方清除?无论如何,检查null值是一个很好的做法,而不是假设。我冒犯了你,投了我一票。 –