使用静态var和传递对象参数之间哪一个更好?

Hel*_*oCW 8 java android

我想写一个APP来记录屏幕,有两种方式,RecordHelper_Method_A和RecordHelper_Method_B.

在RecordHelper_Method_A中,我将mMediaRecorder,MediaProjection mMediaProjection和mVirtualDisplay定义为静态var,它很容易调用,例如StartRecord( mContext, requestCode, resultCode,data),StopRecord().

在RecordHelper_Method_B中,我需要在主Activity类中定义mMediaRecorder,MediaProjection mMediaProjection,并在调用时传递参数StartRecord(mMediaRecorder, mMediaProjection,mVirtualDisplay),'StopRecord(mMediaRecorder,mMediaProjection,mVirtualDisplay)`......,这有点复杂.

我不知道哪一个更好,而且当我结束APP时,我不知道是否可以在RecordHelper_Method_A中正确释放这些静态var.

顺便说一句,如果你有更好的方法,请告诉我吗?谢谢!

RecordHelper_Method_A

public class RecordHelper_Method_A {

    private static MediaRecorder mMediaRecorder;
    private static MediaProjection mMediaProjection;
    private static VirtualDisplay mVirtualDisplay;

    public static void StartRecord(Context mContext,int requestCode, int resultCode, Intent data){

        mMediaRecorder = new MediaRecorder();
        initRecorder();

        MediaProjectionManager mProjectionManager = (MediaProjectionManager) mContext.getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);

        mVirtualDisplay=mMediaProjection.createVirtualDisplay("MainActivity",
                400,600, 300,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                mMediaRecorder.getSurface(), null, null);

        MediaProjectionCallback mMediaProjectionCallback = new MediaProjectionCallback();
        mMediaProjection.registerCallback(mMediaProjectionCallback, null);

        mMediaRecorder.start();
    }

    public static void StopRecord(){
        mMediaProjection=null;
        mMediaRecorder.stop();
        mMediaRecorder.reset();
        mMediaRecorder.release();
        mVirtualDisplay.release();
    }


    private static void initRecorder() {
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        //...
    }

    private static class MediaProjectionCallback extends MediaProjection.Callback {
        @Override
        public void onStop() {
            mMediaRecorder.stop();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

RecordHelper_Method_B

public class RecordHelper_Method_B {

    public static void StartRecord(MediaRecorder mMediaRecorder,MediaProjection mMediaProjection,VirtualDisplay mVirtualDisplay){

        initRecorder(mMediaRecorder);

        mVirtualDisplay=mMediaProjection.createVirtualDisplay("MainActivity",
                400,600, 300,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                mMediaRecorder.getSurface(), null, null);

        MediaProjectionCallback mMediaProjectionCallback = new MediaProjectionCallback(mMediaRecorder);
        mMediaProjection.registerCallback(mMediaProjectionCallback, null);

        mMediaRecorder.start();
    }

    public static void StopRecord(MediaRecorder mMediaRecorder,MediaProjection mMediaProjection,VirtualDisplay mVirtualDisplay){
        mMediaProjection=null;
        mMediaRecorder.stop();
        mMediaRecorder.reset();
        mMediaRecorder.release();
        mVirtualDisplay.release();
    }


    private static void initRecorder(MediaRecorder mMediaRecorder) {
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        //...
    }

    private static class MediaProjectionCallback extends MediaProjection.Callback {
        MediaRecorder mMediaRecorder;
        public MediaProjectionCallback(MediaRecorder mMediaRecorder){
            this.mMediaRecorder=mMediaRecorder;
        }

        @Override
        public void onStop() {
            mMediaRecorder.stop();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Hen*_*nry 9

我建议你Objects不要活着statically.无论您创建什么对象或资源,都应该在活动消失时死亡.因此,在活动中创建这些资源然后传递它是很好的.

此外,我在您建议的两种方法中都看到,这些方法本身就是静态的.最好为类创建一个对象,然后将资源传递给该对象.这可以防止意外的内存泄漏.你可以在你的Activity中做这样的事情.

RecordHelper_Method_B helper = new RecordHelper_Method_B ();
helper.StopRecord(mMediaRecorder,mMediaProjection,mVirtualDisplay);
Run Code Online (Sandbox Code Playgroud)

这使事情变得简单.一旦你Activity死了,helper对象也会死.所以所有资源都将被释放.