2013-12-18 10 views
6

私はライブ壁紙を作成しました。LiveWallpaper:java.lang.IllegalStateException:サーフェスは既に公開されています

これはうまくいきますが、画面を長押ししてライブ壁紙に行ってプレビューでライブ壁紙を開くと壁紙が壊れてしまいます。

私は例外を受け取ります:java.lang.IllegalStateException: Surface has already been released

+1

あなたのコードを投稿してください.. –

答えて

5

コードなしではわかりにくいですが、この例外が表示されていましたが、読み込みが完了する前にプレビューから移動したときにのみ表示されます。私の場合は

、私はonSurfaceCreated方法から離れAsyncTaskを始めたので、それが原因とされていたが、その後の時間で、それは私が、表面はすでに破壊されたsurfaceHolder.lockCanvas()と呼ばれるポイントになりました。このラウンドを取得するには

私は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.isCreated()がありsurfaceHolder.isCreating()があるが、ありません。これは正しい方法ではないかもしれませんが、私のために働いています。

関連する問題