Intereting Posts
Android ListView быстрый прокрутка с разделами: текст раздела слишком длинный Кордовы android build не срабатывают немедленно Кэш-память для Android / Web / Memory Library Передача данных JSON в запросе запроса в качестве тела запроса В структуре MVP какой класс отвечает за сохранение элементов списка и как уведомлять об изменении данных в этом Центрировать текстовые объекты в ListView Scrollview с плавающей функцией linearlayout не будет прокручиваться Is Notification.Builder setTicker по-прежнему полезен в Android 5 и выше? Можно ли запросить DownloadManager в потоке пользовательского интерфейса? Как я могу поделиться изображением с моим приложением Cordova / PhoneGap из другого приложения? Как остановить сборщик мусора Android? Является ли это возможным? Печать штрих-кода с использованием термопринтера Android Нет правила для создания целевой NDK VoIP RTP Потоковая передача с / на сервер (на Java) в / из android Как использовать RecyclerView, пытаясь следовать за предложением разработчика.android.com, но получить ошибку

LiveWallpaper: java.lang.IllegalStateException: поверхность уже выпущена

Я создал Live Wallpaper.

Он отлично работает, но если я хочу долго нажимать на экран, и я иду в Live Wallpapers и открываю Live Wallpaper в предварительном просмотре, после этого Обои обойдется.

Я получаю исключение: java.lang.IllegalStateException: Surface has already been released .

Трудно сказать без вашего кода, но я видел это исключение, но только когда я перешел от предварительного просмотра до того, как он закончил загрузку.

В моем случае это вызвано тем, что я запустил AsyncTask из метода onSurfaceCreated , но к тому времени, когда он дошел до точки, где я назвал surfaceHolder.lockCanvas() поверхность уже была уничтожена.

Чтобы обойти это, я onSurfaceDestroyed метод onSurfaceDestroyed и имел переменную глобальную для этого класса, называемую drawOk , например:

  @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); handler.post(reload); drawOk = true; } @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); handler.removeCallbacks(reload); drawOk = false; } @Override public void onVisibilityChanged(boolean visible) { super.onVisibilityChanged(visible); if(visible) { handler.post(reload); drawOk = true; } else { handler.removeCallbacks(reload); drawOk = false; } } private void draw() { SurfaceHolder surfaceHolder = getSurfaceHolder(); Canvas canvas = null; if(drawOk) { canvas = surfaceHolder.lockCanvas(); if(canvas != null) { // ... } } } 

Существует surfaceHolder.isCreating() , но не surfaceHolder.isCreated() . Возможно, это не самый правильный способ сделать это, но он работает для меня.