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); 

この部分は、通常の状況下正常に動作している:私はこのようになりますコードを使用してキャンバス上に何かを描いています。ただし、このサービスに対応する[設定]で設定が変更されたときに、このコードを実行するリスナーがあります。設定作業からこのコードを実行するたびに​​メソッドでNullPointerが表示されているようです。

壁紙がフォアグラウンドにない場合にのみ、holder.lockCanvas()が表示されているようです。それが前景にないときにこのサーフェスに描画することは不可能ですか?

答えて

2

そうです。これを避ける一般的な方法は、onPauseまたはonVisibilityChanged(false)でリスナーの登録を解除し、onResumeまたはonVisibilityChanged(true)で登録することです。キャンバスが表示されていないときに設定の変更に反応しないでください。

もう1つの解決策は、コードのその部分をヌルチェックで囲み、それを忘れることです。あなたが本当にやりたいことは、コードが表示されていないときに表面に描画しようとすることさえ妨げているからです。

+0

ええとリスナーを削除することはできますが、問題はキャンバスが表示されていないときに再描画して、キャンバスが表示されたときにユーザー設定に基づいて既に更新されるようにすることですユーザーが変更を見ているのは、今起こっていることです。 –

+0

onVisibilityChangeの前に呼び出されるものはありますか? –

+0

これを回避するためにonVisibilityChangedが 'true'を渡すときにonSharedPreferencesChanged(null)を呼び出すことができます。 – Josh

関連する問題