2011-08-05 47 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)中重新註冊,因爲當畫布不可見時不應對設置更改作出反應。

另一種解決方案是簡單地用空檢查來包圍那段代碼,然後忘掉它。不過,我建議不要這樣做,因爲你真正想要做的就是防止你的代碼在不在視圖中時嘗試繪製到表面。

+0

是的,我可以刪除監聽器,它會很好,問題是我希望它在畫布不可見時重繪,以便當畫布變得可見時,它將根據用戶設置進行更新,而不是的用戶看到它發生了變化,這就是現在發生的情況。 –

+0

在onVisibilityChange之前有沒有被調用的東西? –

+0

當onVisibilityChanged傳入'true'來解決此問題時,您可以調用onSharedPreferencesChanged(null)。 – Josh