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

На мой взгляд, это единственный подходящий код, но если вы хотите увидеть больше, я могу опубликовать его здесь (пожалуйста, спросите, прежде чем голосовать против). Кроме того, весь код доступен на Github здесь.


person gsingh2011    schedule 23.11.2012    source источник


Ответы (1)


Я, должно быть, потратил более 10 часов за последние несколько недель, просто работая над этой проблемой, но я, наконец, понял это.

При создании SettingsActivity обои больше не видны, но все равно пытаются рисовать на поверхности. Я изменил оператор if внизу, чтобы обернуть всю функцию рисования, чтобы я не пытался рисовать на поверхности, когда она не видна. Это решило мою проблему.

Надеюсь, это спасет кого-то от потери времени, как это сделал я.

person gsingh2011    schedule 08.12.2012
comment
Спасибо большое! Этот ответ действительно помог мне до сих пор! - person ezpresso; 14.01.2014