Method called after release()

   最近在做公司的一个项目模块时要用到相机,由于采用了以前的代码在UI线程中操作相机时,经常会碰到程序ANR的情况,后来索性一狠心改,翻看google的官方文档说明,

官方是建议用异步线程对camera 进行操作,后来改用异步任务操作camera :

/**
 * 打开相机工具类,放在线程中执行,防止阻塞主线程
 * @author hopehe
 */
public class OpenCameraWorkThread  extends Thread{
	
	private static final String TAG = "OpenCameraWorkThread";
	private SurfaceHolder mSurfaceHolder;
	private Handler       mHandler;
	private boolean       mHasSDCard;
	private boolean       mInitParam;
    public static final int MSG_WHAT_OPEN_CAMERA = 0xff20;
	public OpenCameraWorkThread(SurfaceHolder surfaceHolder,Handler handler,boolean hasSDCard) 
	{
		mSurfaceHolder = surfaceHolder;
		mHandler = handler;
		mHasSDCard = hasSDCard;
	}
	@Override
	public void run() 
	{
		if (mHasSDCard && CameraUtil.FindFrontCamera())
        {
			CMTracer.i(TAG,"open camera do in backgroud");
			mInitParam = CameraUtil.OpenCamera(mSurfaceHolder);
			Message msg = mHandler.obtainMessage();
			msg.what = HandlerConstans.MSG_WHAT_OPEN_CAMERA;
			msg.obj = mSurfaceHolder;
			mHandler.sendMessage(msg);
        }
		super.run();
		
	}

}
结果问题来了!!!不断有crash 异常,显示 

Method called after release() 异常,google 之,前人也碰到类似问题,后来发现在三星手机上在两个都需要使用camera的activity之前切换时,容易发生此异常

个人理解应该是在 release() camera之后,下次打开相机出现异常,导致初始化失败,这时切换activity , 再去操作释放相机,导致上述异常,最终代码修改如下:

  public void surfaceDestroyed(SurfaceHolder holder)
  {
      //本次打开相机失败,直接返回,防止异常
      if (!initCam)  
       return;
      CMTracer.i("Camera", "camera----------------surfaceDestroyed");
      holder.removeCallback(this);
      CameraUtil.exit();
      initCam = false;
 }

hope it works ~





你可能感兴趣的:(Android开发)