问题描述
|
http://www.helloandroid.com/tutorials/how-use-canvas-your-android-apps-part-1
在本教程的最后,提供了源代码下载链接。
我下载了代码并尝试了此示例,它在屏幕上画了一只袋鼠,在1-2分钟内我崩溃了,应用程序冻结了。
我尝试使用Archos 70 Internet Tablet。
“我想知道原因,或者这是否有问题”
这是LogCat
04-13 17:03:24.089:调试/ ondraw(2070):lefutott
04-13 17:03:24.097:调试/ ondraw(2070):lefutott
04-13 17:03:24.113:调试/ ondraw(2070):lefutott
04-13 17:03:24.128:调试/ ondraw(2070):lefutott
04-13 17:03:24.136:调试/ ondraw(2070):lefutott
04-13 17:03:24.152:调试/ ondraw(2070):lefutott
04-13 17:03:24.167:调试/ ondraw(2070):lefutott
04-13 17:03:24.175:调试/ ondraw(2070):lefutott
04-13 17:04:10.019:WARN / ActivityManager(1302):广播broadcastRecord {457f99c8 android.intent.action.TIME_TICK}超时-接收者=android.app.ActivityThread$PackageInfo$Receiverdispatcher$InnerReceiver@4561a5c8
04-13 17:04:10.019:WARN / ActivityManager(1302):超时期间的接收器:broadcastFilter {454ed4c8 ReceiverList {454fbd70 1302 system / 1000 local:4561a5c8}}
04-13 17:04:38.972:INFO / Process(1302):发送信号PID:1302 SIG:3
04-13 17:04:38.972:INFO / dalvikvm(1302):threadid = 3:对信号3做出反应
04-13 17:04:39.097:INFO / dalvikvm(1302):将堆栈跟踪写入\'/ data / anr / traces.txt \'
04-13 17:05:09.097:INFO / Process(1302):发送信号PID:1302 SIG:3
04-13 17:05:09.097:INFO / dalvikvm(1302):threadid = 3:对信号3做出反应
04-13 17:05:09.128:INFO / dalvikvm(1302):将堆栈跟踪写入\'/ data / anr / traces.txt \'
04-13 17:05:09.128:INFO / Process(1302):发送信号PID:1433 SIG:3
04-13 17:05:09.128:INFO / dalvikvm(1433):threadid = 3:对信号3做出反应
04-13 17:05:09.144:INFO / dalvikvm(1433):将堆栈跟踪写入\'/ data / anr / traces.txt \'
04-13 17:05:11.144:INFO / Watchdog_N(1302):dumpKernelStacks
04-13 17:05:11.144:错误/ Watchdog_N(1302):无法打开TID 1302的堆栈:13(权限被拒绝)
04-13 17:05:11.144:错误/ Watchdog_N(1302):无法打开TID 1303的堆栈:13(权限被拒绝)
解决方法
onDraw看起来像这样:
@Override
public void onDraw(Canvas canvas) {
Paint paint = new Paint();
Bitmap kangoo = BitmapFactory.decodeResource(getResources(),R.drawable.kangoo);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(kangoo,10,null);
}
因此,每次运行时,它都会创建一个新的绘画,并且可能(我没有使用BitmapFactory)创建一个新的位图。这似乎有些矫kill过正(特别是因为未使用油漆,尽管看起来确实在第2部分中)。我会考虑将这些位移动到面板的构造函数中,以查看它是否有所不同,例如:
public class Panel extends SurfaceView implements SurfaceHolder.Callback{
// rest of class ignored for brevity
private Paint paint;
private Bitmap kangoo;
public Panel(Context context,AttributeSet attrs) {
super(context,attrs);
getHolder().addCallback(this);
canvasthread = new CanvasThread(getHolder(),this);
setFocusable(true);
paint = new Paint();
kangoo = BitmapFactory.decodeResource(getResources(),R.drawable.kangoo);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(kangoo,null);
}
}
还可能值得在模拟器中运行它,以查看是否遇到相同的问题,或者它是否特定于设备。
编辑:
还值得注意的是,CanvasThread类中的run()方法没有任何睡眠,因此它以最快的速度运行,从而重绘了屏幕。对于一个教程来说,这可能没问题,但是在实际应用中,我希望在运行方法中具有适当睡眠的某种目标帧速率,否则似乎您将使用大量的cpu周期(大概是电池)用户可能不会注意到。