2

我有一個運行良好的動態壁紙。我想添加一個設置活動,所以我做了所有必需的步驟,並且設置按鈕顯示出來,當我去到動態壁紙選擇器。但是,當我點擊設置按鈕時,出現以下異常。IllegalArgumentException當切換到動態壁紙設置活動

11-23 16:12:53.158: E/AndroidRuntime(5141): FATAL EXCEPTION: main 
11-23 16:12:53.158: E/AndroidRuntime(5141): java.lang.IllegalArgumentException 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at android.view.Surface.nativeUnlockCanvasAndPost(Native Method) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at android.view.Surface.unlockCanvasAndPost(Surface.java:457) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at com.android.internal.view.BaseSurfaceHolder.unlockCanvasAndPost(BaseSurfaceHolder.java:215) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at com.gulshansingh.hackerlivewallpaper.HackerWallpaperService$HackerWallpaperEngine.draw(HackerWallpaperService.java:48) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at com.gulshansingh.hackerlivewallpaper.HackerWallpaperService$HackerWallpaperEngine.access$0(HackerWallpaperService.java:36) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at com.gulshansingh.hackerlivewallpaper.HackerWallpaperService$HackerWallpaperEngine$1.run(HackerWallpaperService.java:31) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at android.os.Handler.handleCallback(Handler.java:725) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at android.os.Handler.dispatchMessage(Handler.java:92) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at android.os.Looper.loop(Looper.java:137) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
11-23 16:12:53.158: E/AndroidRuntime(5141):  at dalvik.system.NativeStart.main(Native Method) 

這是這是造成已現在工作正常,直到異常的代碼(導致異常的行已被指示的):

/** Draws all of the bit sequences on the screen */ 
    private void draw() { 
     SurfaceHolder holder = getSurfaceHolder(); 
     Canvas c = holder.lockCanvas(); 
     if (c != null) { 
      try { 
       c.drawARGB(255, 0, 0, 0); 

       for (int i = 0; i < sequences.size(); i++) { 
        sequences.get(i).draw(c); 
       } 

      } finally { 
       holder.unlockCanvasAndPost(c); // line 48 
      } 
     } 

     // Remove the runnable, and only schedule the next run if visible 
     handler.removeCallbacks(drawRunnable); 
     if (visible) { 
      handler.post(drawRunnable); 
     } else { 
      stop(); 
     } 
    } 

sequences.get(i).draw()方法如下

synchronized public void draw(Canvas canvas) { 
    paint.setAlpha(0); 
    float prevY = y; 
    for (int i = 0; i < bits.size(); i++) { 
     canvas.drawText(bits.get(i), x, y, paint); 
     y += TEXT_SIZE; 
     paint.setAlpha(paint.getAlpha() + INCREMENT); 
    } 
    y = prevY; 
} 

在我看來這是唯一的相關代碼,但如果你想看到更多我可以在這裏發佈(請在downvoting之前問)。此外,整個代碼可在Github here上獲得。

回答

6

在過去的幾個星期裏,我必須花費超過10個小時來處理這個問題,但我終於明白了。

創建設置活動時,壁紙不再可見,但仍會嘗試在曲面上繪製。我改變了底部的if語句來包裝整個繪圖函數,所以當它不可見時我不會嘗試繪製表面。這解決了我的問題。

希望這可以節省一些人浪費我和我一樣多的時間。

+0

非常感謝!這個答案到目前爲止幫助我很大! – ezpresso