Android 如果曲面不在前景中,则SurfaceHolder.lockCanvas返回null

Android 如果曲面不在前景中,则SurfaceHolder.lockCanvas返回null,android,live-wallpaper,android-canvas,surfaceholder,Android,Live Wallpaper,Android Canvas,Surfaceholder,我目前正在用Android的LiveWallpaper做一个测试。我正在画布上绘制一些东西,使用的代码如下所示: final SurfaceHolder holder = getSurfaceHolder(); Canvas c = new Canvas(); c = holder.lockCanvas(); // c becomes null c.save(); c.drawBitmap(currentBitmap); c.restore(); holder.unlockCanvasAndPo

我目前正在用Android的LiveWallpaper做一个测试。我正在画布上绘制一些东西,使用的代码如下所示:

final SurfaceHolder holder = getSurfaceHolder();
Canvas c = new Canvas();
c = holder.lockCanvas(); // c becomes null
c.save();
c.drawBitmap(currentBitmap);
c.restore();
holder.unlockCanvasAndPost(c);
这部分在正常情况下工作正常。但是,我有一个监听器,每当在与此服务对应的设置中更改设置时,它就会执行此代码。似乎每当我从设置活动执行这段代码时,我都会在
c.save()
方法上得到一个
NullPointer


似乎只有当墙纸不在前景时,holder.lockCanvas()才会出现。当这个表面不在前景时,它是不可能画到这个表面的吗?

没错。避免这种情况的一种常见方法是在onPause或onVisibilityChanged(false)中注销侦听器,然后在onResume或onVisibilityChanged(true)中重新注册,因为当画布不可见时,您不应该对设置更改做出反应


另一个解决方案是简单地用空检查包围代码部分,然后忘记它。不过,我建议您不要这样做,因为您真正想做的是防止代码在不可见的情况下试图绘制到表面。

没错。避免这种情况的一种常见方法是在onPause或onVisibilityChanged(false)中注销侦听器,然后在onResume或onVisibilityChanged(true)中重新注册,因为当画布不可见时,您不应该对设置更改做出反应


另一个解决方案是简单地用空检查包围代码部分,然后忘记它。不过,我建议您不要这样做,因为您真正想做的是阻止代码在看不见的情况下甚至尝试绘制到表面。

我意识到这个问题很古老,但有了同样的问题,找到了一个对我有用的不同答案,我想我会为后代分享


从曲面获取画布之前,请检查SurfaceHolder.getSurface.isValid()是否有效。修复了我的空画布问题。

我意识到这个问题很古老,但有了同样的问题,找到了一个对我有用的不同答案,我想我会为后代分享


从曲面获取画布之前,请检查SurfaceHolder.getSurface.isValid()是否有效。修复了我的空画布问题。

是的,我可以删除侦听器,这会很好,问题是我希望它在画布不可见时重新绘制,这样当画布可见时,它将根据用户设置进行更新,而不是用户看到它的更改,这就是现在正在发生的事情。onVisibilityChange之前是否调用了某些内容?当onVisibilityChanged通过
true
时,您可以调用onSharedPreferencesChanged(null)来解决此问题。是的,我可以删除侦听器,这将是一件好事,问题是我希望它在画布不可见时重新绘制,因此,当画布变为可见时,它将根据用户设置进行更新,而不是用户看到它发生更改,这就是现在正在发生的情况。在onVisibilityChange之前是否有调用的内容?您可以调用onSharedPreferencesChanged(null)当onVisibilityChanged通过
true
来回避这个问题时。这个问题由来已久,但我的投票不是!谢谢这个问题很古老,但我的投票却不是!谢谢