问题
最近在做RTSP流录制功能,基本结构为 CameraActivity —> PlayFragment(流预览,TextureView:因为有缩放相关操作) ——> RTSPPlayer(两个线程通过MedeaCodec分别做音频和视频track编解码处理) ,一个按钮控制录制开始和结束, 录制中isRecording 和 isIdle 两种状态,由于需要保持各层状态一致,每层通过ResultReceiver 层层传递消息 。
Static 变量 isRecording:定义在acitivity,默认为false ,统一确定录制状态 。
问题复现:当处于录制状态时,isRecording 为true ,录制按钮的判断通过这个boolean值判断,如果正在录制就stop,如果Idle状态就开始录制。点击返回关闭acitivity(默认执行stopRecord操作),此时从RTSPPlayer线程中回调stop消息 到 fragment 再到acitivity ,然而中间fragment由于生命周期问题将消息return掉了 ,然后重新进入activity点击录制按钮始终失效。
问题原因:isRecording变量为static 。
static变量在类加载时被初始化,存储在JVM的方法区中,整个内存中只有一个static变量的拷贝。
activity关闭后由于已经加载过一次CameraActivity 类,根据static的特性 isRecording并不会重新加载赋值,则一直为true,导致重新进入CameraActivity 后录制按钮功能失常。
总结:很基础的一个static的问题,犯这种错误也是因为对知识不敏感,不熟悉,以后少犯没必要的错误。
Static变量在类加载时被初始化,存储在JVM的方法区中,整个内存中只有一个static变量的拷贝,可以使用类名直接访问,也可以通过类的实例化对象访问,一般不推荐通过实例化对象访问,通俗的讲static变量属于类,不属于对象,任何实例化的对象访问的都是同一个static变量,任何地放都可以通过类名来访问static变量