【奇葩】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
...全文
392 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
在CAD(计算机辅助设计)软件中,线性是构建采矿工程图的重要元素。"cad采矿用各种线性"指的是在CAD环境下,为了精确地表示采矿工程的地质结构、开采路径、巷道布局等,所使用的一系列特定线型。这些线型通常包括连续线、虚线、点划线以及定制的特殊线型,以便清晰地标识不同类型的地质特征、开采边界和安全区域。 线型在CAD中起到区分和标识不同对象的作用。例如,连续线可能用于表示巷道的实际走向,虚线可能用于表示规划中的巷道或尚未施工的部分,点划线则可能用于显示支撑结构或危险区域。通过选择合适的线型,工程师们可以更直观地理解采矿工程的设计和进度。 `.lin`文件是CAD中的线型文件,它包含了线型的定义。用户可以自定义线型,如设置线型的比例因子、每个线段的长度和间隔,以及它们的组合方式。`.lin`文件可以被CAD软件读取,使得用户在绘图时能够选择并应用这些预定义的线型。 `.shp`和`.shx`文件则是与CAD中的形状文件相关的。`.shp`文件是一种存储地理空间数据的标准格式,通常包含几何对象(如点、线和多边形)的信息。在采矿领域,这些文件可能用于表示矿体的边界、巷道的位置或其他地质特征。`.shx`文件是`.shp`文件的索引,用于快速访问和处理数据,提高软件的性能。 结合这些文件,我们可以创建一个全面的采矿工程图,其中包括了各种定制的线性表示,使设计和分析工作更为准确高效。在实际操作中,工程师首先会根据需求定义或导入`.lin`文件,然后在绘制巷道、矿体和其他元素时选择相应的线型。同时,他们会利用`.shp`和`.shx`文件来加载和管理地理空间数据,以便在CAD环境中呈现采矿区域的三维视图和二维平面图。 通过熟练掌握CAD中的线性操作,采矿工程师能够更好地进行规划、模拟和沟通,确保采矿作业的安全性和经济性。此外,这些技术也可以应用于其他工程领域,如土木工程、地质调查等,因为线型的使用是通用的,旨在提供清晰的视觉表示和专业信息的传递。因此,深入理解和应用CAD中的线性是现代工程设计不可或缺的一部分。

80,471

社区成员

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

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