Canvas和surfaceView示例崩溃/冻结-内存泄漏?

问题描述

| 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周期(大概是电池)用户可能不会注意到。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...