在屏幕上画了几条线之后就出现:
07-11 22:44:19.907: W/System.err(487): java.lang.NullPointerException
07-11 22:44:19.907: W/System.err(487): at com.sg.main.MainView.onDraw(MainView.java:95)
07-11 22:44:19.907: W/System.err(487): at com.sg.main.MainView.run(MainView.java:74)
07-11 22:44:19.907: W/System.err(487): at java.lang.Thread.run(Thread.java:1019)
07-11 22:44:20.068: E/Surface(487): Surface::lock failed, already locked
07-11 22:44:20.082: E/SurfaceHolder(487): Exception locking surface
07-11 22:44:20.082: E/SurfaceHolder(487): java.lang.IllegalArgumentException
07-11 22:44:20.082: E/SurfaceHolder(487): at android.view.Surface.lockCanvasNative(Native Method)
07-11 22:44:20.082: E/SurfaceHolder(487): at android.view.Surface.lockCanvas(Surface.java:314)
07-11 22:44:20.082: E/SurfaceHolder(487): at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:762)
07-11 22:44:20.082: E/SurfaceHolder(487): at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:741)
07-11 22:44:20.082: E/SurfaceHolder(487): at com.sg.main.MainView.onDraw(MainView.java:89)
07-11 22:44:20.082: E/SurfaceHolder(487): at com.sg.main.MainView.run(MainView.java:74)
07-11 22:44:20.082: E/SurfaceHolder(487): at java.lang.Thread.run(Thread.java:1019)
07-11 23:11:38.210: E/Surface(636): Surface::lock failed, already locked
07-11 23:11:38.210: E/SurfaceHolder(636): Exception locking surface
public class MainView extends SurfaceView implements SurfaceHolder.Callback,
Runnable { private SurfaceHolder mHolder;
private boolean mLoop;
private GraphFactory graphFactory;
private Graph curGraph;
private GUnit curUnit;
private List<Graph> graphList; public MainView(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
setFocusable(true);
mLoop = true; // 循环画图
isEidt = false; graphList = new ArrayList<Graph>(); new Thread(this).start();
} @Override
public void run() {
while (mLoop) {
try {
Thread.sleep(100);
synchronized (mHolder) {
onDraw();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} } public void onDraw() {
if (mHolder == null) {
return;
}
Canvas canvas = mHolder.lockCanvas();
if (canvas == null) {
return;
}
super.onDraw(canvas); canvas.drawColor(Color.WHITE); // 背景色
int color = Color.BLACK; // 画笔颜色
int width = 3; // 画笔宽度 GraphControl graphControl = new GraphControl(graphList, color, width); graphControl.drawObj(curGraph, canvas); // 绘制当前勾画的草图,调用各图形的画图函数
graphControl.drawObjList(canvas); // 绘制已有的图像对象列表 mHolder.unlockCanvasAndPost(canvas);
}
07-11 22:44:19.907: W/System.err(487): java.lang.NullPointerException
07-11 22:44:19.907: W/System.err(487): at com.sg.main.MainView.onDraw(MainView.java:95)
07-11 22:44:19.907: W/System.err(487): at com.sg.main.MainView.run(MainView.java:74)
07-11 22:44:19.907: W/System.err(487): at java.lang.Thread.run(Thread.java:1019)
07-11 22:44:20.068: E/Surface(487): Surface::lock failed, already locked
07-11 22:44:20.082: E/SurfaceHolder(487): Exception locking surface
07-11 22:44:20.082: E/SurfaceHolder(487): java.lang.IllegalArgumentException
07-11 22:44:20.082: E/SurfaceHolder(487): at android.view.Surface.lockCanvasNative(Native Method)
07-11 22:44:20.082: E/SurfaceHolder(487): at android.view.Surface.lockCanvas(Surface.java:314)
07-11 22:44:20.082: E/SurfaceHolder(487): at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:762)
07-11 22:44:20.082: E/SurfaceHolder(487): at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:741)
07-11 22:44:20.082: E/SurfaceHolder(487): at com.sg.main.MainView.onDraw(MainView.java:89)
07-11 22:44:20.082: E/SurfaceHolder(487): at com.sg.main.MainView.run(MainView.java:74)
07-11 22:44:20.082: E/SurfaceHolder(487): at java.lang.Thread.run(Thread.java:1019)
07-11 23:11:38.210: E/Surface(636): Surface::lock failed, already locked
07-11 23:11:38.210: E/SurfaceHolder(636): Exception locking surface
public class MainView extends SurfaceView implements SurfaceHolder.Callback,
Runnable { private SurfaceHolder mHolder;
private boolean mLoop;
private GraphFactory graphFactory;
private Graph curGraph;
private GUnit curUnit;
private List<Graph> graphList; public MainView(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
setFocusable(true);
mLoop = true; // 循环画图
isEidt = false; graphList = new ArrayList<Graph>(); new Thread(this).start();
} @Override
public void run() {
while (mLoop) {
try {
Thread.sleep(100);
synchronized (mHolder) {
onDraw();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} } public void onDraw() {
if (mHolder == null) {
return;
}
Canvas canvas = mHolder.lockCanvas();
if (canvas == null) {
return;
}
super.onDraw(canvas); canvas.drawColor(Color.WHITE); // 背景色
int color = Color.BLACK; // 画笔颜色
int width = 3; // 画笔宽度 GraphControl graphControl = new GraphControl(graphList, color, width); graphControl.drawObj(curGraph, canvas); // 绘制当前勾画的草图,调用各图形的画图函数
graphControl.drawObjList(canvas); // 绘制已有的图像对象列表 mHolder.unlockCanvasAndPost(canvas);
}
super.onDraw(canvas);原因是:super不存在,必须在public void onDraw()前面加上一行
@Override加上“@Override”是代表着onDraw是MainView的事件之一,这样super就不会为空了,但加上“@Override”后,onDraw的代码必须符合MainView的onDraw应有的规则,否则会有错误提示。
public class MainView extends SurfaceView implements SurfaceHolder.Callback,
Runnable {private SurfaceHolder mHolder;
private boolean mLoop;
private GraphFactory graphFactory;
private Graph curGraph;
private GUnit curUnit;
private List<Graph> graphList;public MainView(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
setFocusable(true);
mLoop = true; // 循环画图
isEidt = false;graphList = new ArrayList<Graph>();new Thread(this).start();
}@Override
public void run() {
while (mLoop) {
try {
Thread.sleep(100);
synchronized (mHolder) {
onDraw(); //at com.sg.main.MainView.run是这个
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}}public void onDraw() {
if (mHolder == null) {
return;
}
Canvas canvas = mHolder.lockCanvas(); //at com.sg.main.MainView.onDraw是这个
if (canvas == null) {
return;
}
super.onDraw(canvas);canvas.drawColor(Color.WHITE); // 背景色
int color = Color.BLACK; // 画笔颜色
int width = 3; // 画笔宽度GraphControl graphControl = new GraphControl(graphList, color, width);graphControl.drawObj(curGraph, canvas); // 绘制当前勾画的草图,调用各图形的画图函数
graphControl.drawObjList(canvas); // 绘制已有的图像对象列表mHolder.unlockCanvasAndPost(canvas);
}
把super.onDraw(canvas);注释了也不行