我在一个额外的线程中将一个画布渲染到一个surfaceview,它处理画布的锁定和解锁。 因为如果我使用homebutton切换到主屏幕我的应用程序崩溃(错误:nullpointerexception,canvas为null)我确定在计算画布不为null之前。 所以我这样做:
@Override
public void run(){
while(running){
Canvas canvas = this.holder.lockCanvas();
if(canvas != null) {
this.render.canvas = canvas;
this.render.RenderOneStep();
}
this.holder.unlockCanvasAndPost(this.render.DisplayResult());
this.view.postInvalidate();
}
}
但如果我切换到主屏幕,我会收到这个奇怪的错误:
12-19 15:09:52.333 11190-11208 / com.example.standardbenutzer.adelpath A / libc:致命信号11(SIGSEGV)位于0x00000000(代码= 1),线程11208(线程-1006)
12-19 15:09:52.387 11190-11208 / com.example.standardbenutzer.adelpath A / libc:发送停止信号到pid:11190 in void debuggerd_signal_handler(int,siginfo_t *,void *)
任何想法如何让它发挥作用?
答案 0 :(得分:0)
关闭onStop中的渲染线程并在onStart
中重新启动它不确定这是否能解决您的问题
当我在画布上渲染时,我总是在我的活动被销毁时停止渲染线程(onStop或onDestroy),并在我重新进入活动时再次启动它。
我保持对执行canvas lock unlockAndPost逻辑的runnable类的引用。 当我退出时,我在runnable上调用一个方法来结束渲染线程。
在你的情况下改变"运行"变量为false。
我做的另一件事是检查画布对象的宽度是否> 0和高度> 0 如果画布没有宽度或高度,我会跳过渲染。我在某些设备上看到了这一点,但仍不确定原因。
我遇到了类似的问题,这是因为访问与渲染例程中的活动相关的视图(而不是画布)信息。