2013-04-08 72 views
0

當我使用意圖將活動留給其他活動時,surfaceView類崩潰。我如何離開這個活動進行另一個活動而不會崩潰?當退出活動時SurfaceView類崩潰,Android

我用這個意圖離開這個階級和打開另一項活動叫CameraView類:

04-08 21:42:46.620: W/IInputConnectionWrapper(25016): finishComposingText on inactive InputConnection 
04-08 21:42:46.630: E/SurfaceView(25016): NullPointerException while updating window. 
mSession = [email protected], mWindow = [email protected] 
04-08 21:42:46.630: E/SurfaceView(25016): Unexpected NullPointerException. 
04-08 21:42:46.630: D/AndroidRuntime(25016): Shutting down VM 
04-08 21:42:46.630: W/dalvikvm(25016): threadid=1: thread exiting with uncaught exception (group=0x40aca9d8) 
04-08 21:42:46.640: E/AndroidRuntime(25016): FATAL EXCEPTION: main 
04-08 21:42:46.640: E/AndroidRuntime(25016): java.lang.NullPointerException 
04-08 21:42:46.640: E/AndroidRuntime(25016): at android.view.SurfaceView.updateWindow(SurfaceView.java:578) 
04-08 21:42:46.640: E/AndroidRuntime(25016): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:226) 

surfaceView活動代碼:

class Preview extends SurfaceView implements SurfaceHolder.Callback { 
     SurfaceHolder mHolder; 
     DrawOnTop mDrawOnTop; 


     Preview(Context context, DrawOnTop drawOnTop) { 
      super(context); 

      mDrawOnTop = drawOnTop; 
      mFinished = false; 

      // Install a SurfaceHolder.Callback so we get notified when the 
      // underlying surface is created and destroyed. 
      mHolder = getHolder(); 
      mHolder.addCallback(this); 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     } 

     public void surfaceCreated(SurfaceHolder holder) { 

      try { 
       mCamera = Camera.open(); 
       mCamera.setPreviewDisplay(holder); 
       mCamera.startPreview(); 

       // Preview callback used whenever new viewfinder frame is available 
       mCamera.setPreviewCallback(new PreviewCallback() { 
        public void onPreviewFrame(byte[] data, Camera camera) 
        { 
         if ((mDrawOnTop == null) || mFinished) 
          return; 

         if (mDrawOnTop.mBitmap == null) 
         { 
          // Initialize the draw-on-top companion 
          Camera.Parameters params = camera.getParameters(); 
          mDrawOnTop.mImageWidth = params.getPreviewSize().width; 
          mDrawOnTop.mImageHeight = params.getPreviewSize().height; 
          mDrawOnTop.mBitmap = Bitmap.createBitmap(mDrawOnTop.mImageWidth, 
          mDrawOnTop.mImageHeight, Bitmap.Config.RGB_565); 
          mDrawOnTop.mRGBData = new int[mDrawOnTop.mImageWidth * mDrawOnTop.mImageHeight]; 
          mDrawOnTop.mYUVData = new byte[data.length];      
         } 

         // Pass YUV data to draw-on-top companion 
         System.arraycopy(data, 0, mDrawOnTop.mYUVData, 0, data.length); 
         mDrawOnTop.invalidate(); 
        } 
       }); 
      } 
      catch (IOException exception) { 
       mFinished = true; 
       mCamera.setPreviewCallback(null); 
       mCamera.stopPreview(); 
       mCamera.release(); 
       mCamera = null; 
      } 
     } 

     public void surfaceDestroyed(SurfaceHolder holder) { 
      // Surface will be destroyed when we return, so stop the preview. 
      // Because the CameraDevice object is not a shared resource, it's very 
      // important to release it when the activity is paused. 
      mFinished = true; 
      mCamera.setPreviewCallback(null); 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 

     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
      // Now that the size is known, set up the camera parameters and begin 
      // the preview. 
      Camera.Parameters parameters = mCamera.getParameters(); 
      parameters.setPreviewSize(320, 240); 
      parameters.setPreviewFrameRate(15); 
      parameters.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT); 
      parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
      mCamera.setParameters(parameters); 
      mCamera.startPreview(); 
     } 

    } // end surfaceview 

回答

-1

找到了工作的答案是將System.exit(0)放在onPause方法中。修復了所有問題和應用程序的可靠性和100%穩定性。退出活動時不再崩潰。

在onPause方法中放置finish()不起作用,應用程序在用曲面視圖退出活動後隨機時間繼續崩潰。

確實有助於減少崩潰的一件事是改變stopPreview()和setpreviewCalback(null)的位置。並刪除setpreviewcallback(null)。在用意圖退出活動之前調用這些修改會減少崩潰次數。

+1

什麼? 'System.exit()的'?真的嗎?!? – 2014-03-27 09:26:44

+0

切勿使用System.exit()。瞭解活動的生命週期如何影響您的相機流量。閱讀相機的文檔以瞭解何時調用startPreview(),stopPreview()以及何時釋放相機資源。 – 2015-06-19 07:53:53

0

Intent intent = new Intent(this, CameraView.class); 
    startActivity(intent); 

從logcat的堆棧跟蹤請先嚐試撥打stopPreview(),然後再撥打setPreviewCallback(null)