SurfaceView是在新起的单独线程中可以重新绘制画面,View是在主线程中更新画面。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

之前我在用surfaceview做动画时,会经常奔溃,来看我部分代码块

[java]  view plain

copy

@Override

publicvoidrun() {

Canvas canvas;

// initialise timing elements for stat gathering

initTimingElements();

longbeginTime;// the time when the cycle begun

longtimeDiff;// the time it took for the cycle to execute

intsleepTime;// ms to sleep (<0 if we're behind)

intframesSkipped;// number of frames being skipped

sleepTime = 0;

while(running) {

canvas = null;

// try locking the canvas for exclusive pixel editing

// in the surface

try{

canvas = this.surfaceHolder.lockCanvas();

LoggerHandler.log("canvas : "+ canvas);

synchronized(surfaceHolder) {

beginTime = System.currentTimeMillis();

framesSkipped = 0;// resetting the frames skipped

// update game state

this.gamePanel.update();

// render state to the screen

// draws the canvas on the panel

this.gamePanel.render(canvas);

// calculate how long did the cycle take

timeDiff = System.currentTimeMillis() - beginTime;

// calculate sleep time

sleepTime = (int) (FRAME_PERIOD - timeDiff);

if(sleepTime >0) {

// if sleepTime > 0 we're OK

try{

// send the thread to sleep for a short period

// very useful for battery saving

Thread.sleep(sleepTime);

} catch(InterruptedException e) {

}

}

while(sleepTime <0&& framesSkipped

// we need to catch up

this.gamePanel.update();// update without rendering

sleepTime += FRAME_PERIOD; // add frame period to check

framesSkipped++;

}

当我反复按回退键或者横竖屏切换时

报错的地方在于

canvas = this.surfaceHolder.lockCanvas(); 说canvas返回为空。

这样的原因在于线程执行的时间不同,有可能原来的线程还没有执行完毕,你又重新启动了例外一个线程,这就导致了

程序奔溃。

解决方法:加锁且判断当前画布是否为空。(如果你想控制surfaceView帧数,可以在后面添加)

[java]  view plain

copy

publicvoidrun() {

SurfaceHolder surfaceHolder = holder;

// 重复绘图循环,直到线程停止

while(!done) {

// 锁定SurfaceView,并返回到要绘图的Canvas

Canvas canvas = surfaceHolder.lockCanvas();  // ①

// 绘制背景图片

if(canvas !=null) {

synchronized(surfaceHolder) {

canvas.drawBitmap(back, 0,0,null);

if(fishX

fishX = mScreenWidth;

fishY = (float) (Math.random() * (mScreenHeight));

fishAngle = newRandom().nextInt(60);

}

if(fishY

fishX = mScreenWidth;

fishY = (float) (Math.random() * (mScreenHeight));

fishAngle = newRandom().nextInt(60);

}

// 使用Matrix来控制鱼的旋转角度和位置

matrix.reset();

matrix.setRotate(fishAngle);

matrix.postTranslate(fishX -= fishSpeed * Math

.cos(Math.toRadians(fishAngle))

, fishY -= fishSpeed * Math.sin(Math.toRadians(fishAngle)));

canvas.drawBitmap(fishs[fishIndex++ % fishs.length], matrix, null);

}

}

// 解锁Canvas,并渲染当前图像

if(canvas !=null) {

surfaceHolder.unlockCanvasAndPost(canvas);

}

// //确保每次更新时间的帧数

try{

Thread.sleep(TIME_IN_FRAME);

} catch(InterruptedException e) {

}

}

}

Thanks!

小奋斗文章

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

android 崩溃原因,Android SurfaceView常见崩溃的原因以及解决办法相关推荐

  1. Android Studio安装教程及安装中出现问题的解决办法

    Android Studio安装教程及安装中出现问题的解决办法 Android Studio安装教程: 安装网址: AndroidDevtools下载:https://developer.androi ...

  2. ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法

     ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法 java.lang.NoClassDe ...

  3. AMD机器:Android Studio启动模拟器提示“HAXM is not installed”的解决办法

    附:Android Studio启动模拟器提示"HAXM is not installed"的解决办法 1.首先,按住Ctrl+Alt+Delete,选择任务管理器,点击性能,查看 ...

  4. Android环境配置及adb不是内部命令的解决办法

    Android环境配置及adb不是内部命令的解决办法 听语音 | 浏览:12378 | 更新:2016-03-03 15:44 | 标签:ANDROID JDK ECLIPSE 1 2 3 4 5 6 ...

  5. Android小米(miui)获取通话记录为null解决办法

    Android小米(miui)获取通话记录为null解决办法 在开发中发现,查询通话记录时使用 contentResolver.query( CallLog.Calls.CONTENT_URI, Co ...

  6. win10小课堂:常见电脑蓝屏的解决办法

    win10小课堂:常见电脑蓝屏的解决办法 MACHINE-CHECK-EXCEPTION 0X0000007E.0X0000008E 0X000000D1 0x0000001A 0x0000007B ...

  7. 【Python3爬虫】常见反爬虫措施及解决办法(二)...

    [Python3爬虫]常见反爬虫措施及解决办法(二) 这一篇博客,还是接着说那些常见的反爬虫措施以及我们的解决办法.同样的,如果对你有帮助的话,麻烦点一下推荐啦. 一.防盗链 这次我遇到的防盗链,除了 ...

  8. IE浏览器常见CSS兼容性问题及解决办法

    IE浏览器常见CSS兼容性问题及解决办法 参考文章: (1)IE浏览器常见CSS兼容性问题及解决办法 (2)https://www.cnblogs.com/kiscall/p/4679616.html ...

  9. android app crash测试,APP常见崩溃原因和测试方法整理

    测试过APP的人都应该发现,app崩溃是一类非常常见的问题,很多时候还是致命性的,这就要求我们测试人员要尽最大可能去找出软件当中的缺陷,减少app崩溃出现的概率,这里我将收集到的关于针对APP崩溃测试 ...

  10. Google Android 7.0 GMS测试常见fail项以及分析解决方法

    自从Google 7.0系统发布开始以来,所有使用Googl gms 包服务的第三方厂商出货必须都要过GMS认证,而在2018年预计Android 8.1系统上要求将更为严格..本篇博客列举展讯773 ...

最新文章

  1. 使用javascript开发2048
  2. JMS - QueueBrowser
  3. 每天一道LeetCode-----将有序序列转成高度平衡二叉搜索树
  4. 最全三大框架整合(使用映射)——IDeptService.java
  5. php http请求xml数据,使用php从HTTP POST请求中检索XML
  6. win32 ipv6 sendto recvfrom
  7. python etree模块所有函数详解_Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件,封装函数...
  8. 安装ssd后不识别网卡_断桥铝门窗安装后就完了?不!该处理的处理,该检查的还要检查...
  9. 2018 前端开发框架对比
  10. 开源跨平台计算机视觉库OpenCV 4.0正式发布
  11. h5侠客行服务器维护有更新什么,《侠客行》1月22日版本更新说明
  12. java计算机毕业设计医院各科室财务管理2021源码+系统+mysql数据库+lw文档
  13. spring学习之spring框架介绍
  14. Word另存为pdf时提示“由于出现意外错误,导出失败”的解决方案
  15. java在线截图_JAVA之网页截屏
  16. python 将字符串改成小写
  17. Java 7从入门到精通 前 言
  18. 【电子书资源】 PDF格式 持续更新
  19. 计算机系统运行太慢,如何解决电脑运行速度慢
  20. AUTOCAD——偏移命令、移动命令

热门文章

  1. 2020-08-09
  2. java es scroll,Elasticsearch Scroll分页检索案例分享
  3. #if defined和#if !defined的含义
  4. 基于Qt的UDP协议实现及解析数据
  5. 【数据结构】单链表基本操作(C++实现)
  6. 物理综合:Compile
  7. PAT甲题题解-1010. Radix (25)-二分搜索
  8. HDU 5898 odd-even number
  9. C#中符号的作用备忘
  10. [ACM_几何] F. 3D Triangles (三维三角行相交)