2013-12-18 11 views

risposta

5

È difficile dire senza il codice, ma stavo vedendo questa eccezione, ma solo quando ho navigato lontano dall'anteprima prima che fosse terminato il caricamento.

Nel mio caso, veniva causato perché ho iniziato un AsyncTask fuori dal metodo onSurfaceCreated, ma poi quando è arrivato al punto in cui ho chiamato surfaceHolder.lockCanvas() la superficie era già stato distrutto.

Per ovviare a questo ho sovrascritto il metodo onSurfaceDestroyed, e aveva una variabile globale a quella classe chiamata drawOk, in questo modo:

@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) { 
           // ... 
      } 
     } 
    } 

C'è un surfaceHolder.isCreating(), ma non un surfaceHolder.isCreated(). Questo potrebbe non essere il modo giusto per farlo, ma sta funzionando per me.

Problemi correlati