2013-12-18 11 views
6

मैंने एक लाइव वॉलपेपर बनाया है।लाइववैलपेपर: java.lang.IllegalStateException: सतह पहले से ही जारी की जा चुकी है

यह ठीक काम करता है, लेकिन अगर मैं स्क्रीन पर लंबे समय तक प्रेस करना चाहता हूं और मैं लाइव वॉलपेपर पर जाता हूं और पूर्वावलोकन में अपना लाइव वॉलपेपर खोलता हूं, उसके बाद वॉलपेपर खराब हो जाता है।

मुझे अपवाद मिलता है: java.lang.IllegalStateException: Surface has already been released

+1

अपना कोड पोस्ट करें .. –

उत्तर

5

अपने कोड के बिना बताना मुश्किल है, लेकिन मैं यह अपवाद देख रहा था, लेकिन केवल तभी जब मैंने लोडिंग समाप्त होने से पहले पूर्वावलोकन से दूर जाया था।

मेरे मामले में, यह क्योंकि मैं onSurfaceCreated विधि से एक AsyncTask शुरुआत की वजह से किया जा रहा था, लेकिन फिर समय यह बिंदु है जहां मैं surfaceHolder.lockCanvas() बुलाया सतह पहले से ही नष्ट कर दिया गया गया है।

इस दौर प्राप्त करने के लिए मुझे लगता है कि वर्ग drawOk कहा जाता है, इस तरह के overrode onSurfaceDestroyed विधि, और था एक चर वैश्विक:

@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()। यह करने का सही तरीका नहीं हो सकता है, लेकिन यह मेरे लिए काम कर रहा है।

संबंधित मुद्दे