android 崩溃原因,Android SurfaceView常见崩溃的原因以及解决办法
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常见崩溃的原因以及解决办法相关推荐
- Android Studio安装教程及安装中出现问题的解决办法
Android Studio安装教程及安装中出现问题的解决办法 Android Studio安装教程: 安装网址: AndroidDevtools下载:https://developer.androi ...
- ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法
ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法 java.lang.NoClassDe ...
- AMD机器:Android Studio启动模拟器提示“HAXM is not installed”的解决办法
附:Android Studio启动模拟器提示"HAXM is not installed"的解决办法 1.首先,按住Ctrl+Alt+Delete,选择任务管理器,点击性能,查看 ...
- Android环境配置及adb不是内部命令的解决办法
Android环境配置及adb不是内部命令的解决办法 听语音 | 浏览:12378 | 更新:2016-03-03 15:44 | 标签:ANDROID JDK ECLIPSE 1 2 3 4 5 6 ...
- Android小米(miui)获取通话记录为null解决办法
Android小米(miui)获取通话记录为null解决办法 在开发中发现,查询通话记录时使用 contentResolver.query( CallLog.Calls.CONTENT_URI, Co ...
- win10小课堂:常见电脑蓝屏的解决办法
win10小课堂:常见电脑蓝屏的解决办法 MACHINE-CHECK-EXCEPTION 0X0000007E.0X0000008E 0X000000D1 0x0000001A 0x0000007B ...
- 【Python3爬虫】常见反爬虫措施及解决办法(二)...
[Python3爬虫]常见反爬虫措施及解决办法(二) 这一篇博客,还是接着说那些常见的反爬虫措施以及我们的解决办法.同样的,如果对你有帮助的话,麻烦点一下推荐啦. 一.防盗链 这次我遇到的防盗链,除了 ...
- IE浏览器常见CSS兼容性问题及解决办法
IE浏览器常见CSS兼容性问题及解决办法 参考文章: (1)IE浏览器常见CSS兼容性问题及解决办法 (2)https://www.cnblogs.com/kiscall/p/4679616.html ...
- android app crash测试,APP常见崩溃原因和测试方法整理
测试过APP的人都应该发现,app崩溃是一类非常常见的问题,很多时候还是致命性的,这就要求我们测试人员要尽最大可能去找出软件当中的缺陷,减少app崩溃出现的概率,这里我将收集到的关于针对APP崩溃测试 ...
- Google Android 7.0 GMS测试常见fail项以及分析解决方法
自从Google 7.0系统发布开始以来,所有使用Googl gms 包服务的第三方厂商出货必须都要过GMS认证,而在2018年预计Android 8.1系统上要求将更为严格..本篇博客列举展讯773 ...
最新文章
- 使用javascript开发2048
- JMS - QueueBrowser
- 每天一道LeetCode-----将有序序列转成高度平衡二叉搜索树
- 最全三大框架整合(使用映射)——IDeptService.java
- php http请求xml数据,使用php从HTTP POST请求中检索XML
- win32 ipv6 sendto recvfrom
- python etree模块所有函数详解_Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件,封装函数...
- 安装ssd后不识别网卡_断桥铝门窗安装后就完了?不!该处理的处理,该检查的还要检查...
- 2018 前端开发框架对比
- 开源跨平台计算机视觉库OpenCV 4.0正式发布
- h5侠客行服务器维护有更新什么,《侠客行》1月22日版本更新说明
- java计算机毕业设计医院各科室财务管理2021源码+系统+mysql数据库+lw文档
- spring学习之spring框架介绍
- Word另存为pdf时提示“由于出现意外错误,导出失败”的解决方案
- java在线截图_JAVA之网页截屏
- python 将字符串改成小写
- Java 7从入门到精通 前 言
- 【电子书资源】 PDF格式 持续更新
- 计算机系统运行太慢,如何解决电脑运行速度慢
- AUTOCAD——偏移命令、移动命令
热门文章
- 2020-08-09
- java es scroll,Elasticsearch Scroll分页检索案例分享
- #if defined和#if !defined的含义
- 基于Qt的UDP协议实现及解析数据
- 【数据结构】单链表基本操作(C++实现)
- 物理综合:Compile
- PAT甲题题解-1010. Radix (25)-二分搜索
- HDU 5898 odd-even number
- C#中符号的作用备忘
- [ACM_几何] F. 3D Triangles (三维三角行相交)