【奇葩】SurfaceView绘制画布home后返回黑屏

Jachon 2013-08-29 04:49:16
问题遇到很奇葩,我也不知道什么原因,自己用SurfaceView实现了绘制画布,在线程里面通过lockcanvas获取canvas绘制图形,然后绘制完成后点击home按钮,然后再点击程序图标切回程序后会黑屏大概一段时间(有时候秒进,有时候延时很长),代码奉上
t = new Thread(){
public void run() {
Rect rect = new Rect();
rect.left = 20;
rect.top = 20;
rect.bottom = 100;
rect.right = 300;
loadImage();
SurfaceHolder holder = canvas.getHolder();
while(true){
long start = System.currentTimeMillis();
Canvas g = holder.lockCanvas();
if(g != null){
paintImage(g);
//
holder.unlockCanvasAndPost(g);
}else{
// Thread.yield();//把这句注释去掉就可以解决返回黑屏
}
long end = System.currentTimeMillis() - start;
if(end < 33){
try {
Thread.sleep(33-end);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
};
};
t.start();


其中我在当canvas为空的时候thread.yield一下就可以解决home返回后黑屏,求教是什么原因,我同事用同样的代码,没有yield却没有问题
eclipse版本4.2 ADT版本21.1.0
...全文
389 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
danielinbiti 2013-08-30
  • 打赏
  • 举报
回复
引用 9 楼 codeshine 的回复:
[quote=引用 8 楼 liuh6 的回复:] 在onresume中再画一遍
其实不是绘制问题,是我Canvas g = holder.lockCanvas();获取的canvas一直为空,并且为空的时间很长,所以我比较差异问题出在哪里[/quote] 恩,没注意, SurfaceHolder holder = canvas.getHolder(); 你这canvas是什么参数? holder都是SurfaceView类中this.getHolder();方式获得。
Jachon 2013-08-30
  • 打赏
  • 举报
回复
引用 8 楼 liuh6 的回复:
在onresume中再画一遍
其实不是绘制问题,是我Canvas g = holder.lockCanvas();获取的canvas一直为空,并且为空的时间很长,所以我比较差异问题出在哪里
liuh6 2013-08-30
  • 打赏
  • 举报
回复
在onresume中再画一遍
Jachon 2013-08-30
  • 打赏
  • 举报
回复
引用 5 楼 danielinbiti 的回复:
[quote=引用 4 楼 codeshine 的回复:] [quote=引用 3 楼 danielinbiti 的回复:] Thread.yield();不可用,把线程进入可执行状态后什么时候开始执行看机器运行的线程了
谢谢解答 请问下,把线程进入可执行状态后什么时候开始执行看机器运行的线程了,具体是什么意思?[/quote] 一但yield,就不是你能控制的了,也可能立即执行,也可能很长时间后才有其他进程唤醒你这个thread[/quote] 其实我调用yield是因为我怀疑当前线程导致主线程无法把view显示出来,所以做了下线程yield,结果就解决了,有没有朋友遇到相同问题。
Jachon 2013-08-30
  • 打赏
  • 举报
回复
引用 5 楼 danielinbiti 的回复:
[quote=引用 4 楼 codeshine 的回复:] [quote=引用 3 楼 danielinbiti 的回复:] Thread.yield();不可用,把线程进入可执行状态后什么时候开始执行看机器运行的线程了
谢谢解答 请问下,把线程进入可执行状态后什么时候开始执行看机器运行的线程了,具体是什么意思?[/quote] 一但yield,就不是你能控制的了,也可能立即执行,也可能很长时间后才有其他进程唤醒你这个thread[/quote] 这个明白了,谢谢,现在问题就是不加入yield,每次程序点击home后再从后台切回来会出现黑屏,时间并且不确定多久,昨晚在家里也试了试,已经存在问题,请问您知道这个问题的原因么?
Jachon 2013-08-30
  • 打赏
  • 举报
回复
引用 12 楼 danielinbiti 的回复:
[quote=引用 11 楼 codeshine 的回复:] [quote=引用 10 楼 danielinbiti 的回复:] [quote=引用 9 楼 codeshine 的回复:] [quote=引用 8 楼 liuh6 的回复:] 在onresume中再画一遍
其实不是绘制问题,是我Canvas g = holder.lockCanvas();获取的canvas一直为空,并且为空的时间很长,所以我比较差异问题出在哪里[/quote] 恩,没注意, SurfaceHolder holder = canvas.getHolder(); 你这canvas是什么参数? holder都是SurfaceView类中this.getHolder();方式获得。[/quote] 哈哈我的错,csdn不能重新编辑帖子,在此说明下,canvas(小写的)其实是一个继承surfaceview的类[/quote] 那理解了。 代码上 Canvas g = holder.lockCanvas(); if(g != null){ paintImage(g); // holder.unlockCanvasAndPost(g); //这句要和lockCanvas配套,否则锁住了不解锁 } 另外,你启动线程的地方没看到,看是第一次执行时Canvas没有初始化,导致null,然后又没解锁,后面一直获取null,就进不了paintImage. 其他的根据代码就不好推测了 [/quote] 线程在oncreat里面启动的,是说我的小写canvas没有初始化么?
danielinbiti 2013-08-30
  • 打赏
  • 举报
回复
引用 11 楼 codeshine 的回复:
[quote=引用 10 楼 danielinbiti 的回复:] [quote=引用 9 楼 codeshine 的回复:] [quote=引用 8 楼 liuh6 的回复:] 在onresume中再画一遍
其实不是绘制问题,是我Canvas g = holder.lockCanvas();获取的canvas一直为空,并且为空的时间很长,所以我比较差异问题出在哪里[/quote] 恩,没注意, SurfaceHolder holder = canvas.getHolder(); 你这canvas是什么参数? holder都是SurfaceView类中this.getHolder();方式获得。[/quote] 哈哈我的错,csdn不能重新编辑帖子,在此说明下,canvas(小写的)其实是一个继承surfaceview的类[/quote] 那理解了。 代码上 Canvas g = holder.lockCanvas(); if(g != null){ paintImage(g); // holder.unlockCanvasAndPost(g); //这句要和lockCanvas配套,否则锁住了不解锁 } 另外,你启动线程的地方没看到,看是第一次执行时Canvas没有初始化,导致null,然后又没解锁,后面一直获取null,就进不了paintImage. 其他的根据代码就不好推测了
Jachon 2013-08-30
  • 打赏
  • 举报
回复
引用 10 楼 danielinbiti 的回复:
[quote=引用 9 楼 codeshine 的回复:] [quote=引用 8 楼 liuh6 的回复:] 在onresume中再画一遍
其实不是绘制问题,是我Canvas g = holder.lockCanvas();获取的canvas一直为空,并且为空的时间很长,所以我比较差异问题出在哪里[/quote] 恩,没注意, SurfaceHolder holder = canvas.getHolder(); 你这canvas是什么参数? holder都是SurfaceView类中this.getHolder();方式获得。[/quote] 哈哈我的错,csdn不能重新编辑帖子,在此说明下,canvas(小写的)其实是一个继承surfaceview的类
danielinbiti 2013-08-29
  • 打赏
  • 举报
回复
引用 4 楼 codeshine 的回复:
[quote=引用 3 楼 danielinbiti 的回复:] Thread.yield();不可用,把线程进入可执行状态后什么时候开始执行看机器运行的线程了
谢谢解答 请问下,把线程进入可执行状态后什么时候开始执行看机器运行的线程了,具体是什么意思?[/quote] 一但yield,就不是你能控制的了,也可能立即执行,也可能很长时间后才有其他进程唤醒你这个thread
Jachon 2013-08-29
  • 打赏
  • 举报
回复
引用 3 楼 danielinbiti 的回复:
Thread.yield();不可用,把线程进入可执行状态后什么时候开始执行看机器运行的线程了
谢谢解答 请问下,把线程进入可执行状态后什么时候开始执行看机器运行的线程了,具体是什么意思?
danielinbiti 2013-08-29
  • 打赏
  • 举报
回复
Thread.yield();不可用,把线程进入可执行状态后什么时候开始执行看机器运行的线程了
Jachon 2013-08-29
  • 打赏
  • 举报
回复
有没有兄弟一起来探讨下这个问题..
Jachon 2013-08-29
  • 打赏
  • 举报
回复
并且启动的时候也要好久才能进入绘制的view
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 【久久在线FLASH系统】是一款专为久久在线网站打造的交互式Flash平台,集成了前台展示与后台管理功能,满足内容发布、管理和用户互动的需求。Flash技术曾广泛应用于网页动画和互动内容,尤其在早期互联网时代,在游戏、广告和多媒体教学等领域发挥了重要作用。该系统的核心包括以下几个关键方面: Flash技术:系统利用Flash创建动态图形、动画和交互内容,依赖Adobe Flash Player运行。其编程语言ActionScript支持面向对象开发,便于实现复杂逻辑和交互效果。 后台管理系统:作为系统的控制中心,后台支持内容上传、编辑、分类、权限设置、用户管理及数据分析,确保内容的有序更新与发布。 产品演示模块:用户可在线预览和体验产品功能,无需下载,通过交互式演示了解产品操作流程和优势。 数据库集成:系统与数据库紧密结合,用于存储Flash文件信息、用户数据及访问记录,实现高效的数据管理与检索。 安全性与优化:系统具备防止非法访问和数据泄露的安全机制,并对Flash内容进行优化,提升加载速度与用户体验。 响应式设计:尽管Flash主要用于桌面端,系统仍考虑多设备兼容性,通过响应式设计适配不同屏幕尺寸,提供一致体验。 API接口:系统支持与其他平台或服务通过API进行数据交互,如社交媒体分享、数据分析等,拓展功能边界。 用户体验:界面设计注重交互性与视觉效果,提升用户满意度和停留时间,增强平台吸引力。 版本控制:系统支持内容版本管理,便于追踪更新历史,方便内容维护与回滚。 性能监控:内置性能监控工具,实时跟踪系统负载与资源使用情况,及时发现并解决问题,保障系统稳定运行。 【久久在线FLASH系统】是一个综合性解决方案,融合了前端展示、后台管理、互动体验和数据分析等功能,体现了当时Web

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧