2011-08-05 3 views
0

현재 Android에서 LiveWallpaper로 테스트하고 있습니다.SurfaceHolder.lockCanvas는 표면이 전경이 아닌 경우 null을 반환합니다.

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()가 나타납니다. 포 그라운드에 있지 않을 때이 표면으로 그릴 수 없습니까?

답변

2

맞습니다. 이것을 피하는 일반적인 방법은 캔버스가 보이지 않을 때 설정 변경에 반응해서는 안되기 때문에 onPause 또는 onVisibilityChanged (false)에서 리스너 등록을 취소하고 onResume 또는 onVisibilityChanged (true)에 등록하는 것입니다.

또 다른 해결책은 해당 코드 섹션을 null 체크로 둘러싸고 단순히 잊어 버리는 것입니다. 그래도 실제로는 코드가 보이지 않을 때 코드가 표면에 그려지는 것을 막을 수 있기 때문에 이것을 반대하는 것이 좋습니다.

+0

그래, 내가 청취자를 제거 할 수 있다면 좋을 것이다. 문제는 캔버스가 보이지 않을 때 다시 그려서 캔버스가 보이게 될 때 이미 사용자 설정에 따라 업데이트되도록하는 것이다. 사용자가 변경된 것을 볼 수 있습니다. 이는 현재 일어나고있는 일입니다. –

+0

onVisibilityChange 전에 호출되는 항목이 있습니까? –

+0

onVisibilityChanged가 'true'를 전달하면 onSharedPreferencesChanged (null)을 호출하여이 문제를 해결할 수 있습니다. – Josh

관련 문제