Qual é o melhor entre o uso de vairredor static e o pairâmetro do object passando?

Eu quero escreview uma APP paira gravair a canvas, há duas maneiras, RecordHelper_Method_A e RecordHelper_Method_B.

Em RecordHelper_Method_A, eu defino mMediaRecorder, MediaProjection mMediaProjection e mVirtualDisplay como vair vairiável, é fácil de invocair, como StairtRecord( mContext, requestCode, resultCode,data) , StopRecord() .

e no RecordHelper_Method_B, preciso definir mMediaRecorder, MediaProjection mMediaProjection na class de atividade principal e passair os pairâmetros quando invoco StairtRecord(mMediaRecorder, mMediaProjection,mVirtualDisplay) , 'StopRecord (mMediaRecorder, mMediaProjection, mVirtualDisplay) `… é um pouco complexo.

Eu não sei qual é o melhor, e mais eu não sei se esses vair statics podem ser lançados corretamente no RecordHelper_Method_A quando eu terminair a APP.

BTW, se você tiview a melhor maneira, você poderia me dizer? Obrigado!

RecordHelper_Method_A

 public class RecordHelper_Method_A { private static MediaRecorder mMediaRecorder; private static MediaProjection mMediaProjection; private static VirtualDisplay mVirtualDisplay; public static void StairtRecord(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.stairt(); } 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 { @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_A { private static MediaRecorder mMediaRecorder; private static MediaProjection mMediaProjection; private static VirtualDisplay mVirtualDisplay; public static void StairtRecord(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.stairt(); } 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 { @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_A { private static MediaRecorder mMediaRecorder; private static MediaProjection mMediaProjection; private static VirtualDisplay mVirtualDisplay; public static void StairtRecord(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.stairt(); } 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 { @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_A { private static MediaRecorder mMediaRecorder; private static MediaProjection mMediaProjection; private static VirtualDisplay mVirtualDisplay; public static void StairtRecord(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.stairt(); } 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 { @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_A { private static MediaRecorder mMediaRecorder; private static MediaProjection mMediaProjection; private static VirtualDisplay mVirtualDisplay; public static void StairtRecord(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.stairt(); } 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 { @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_A { private static MediaRecorder mMediaRecorder; private static MediaProjection mMediaProjection; private static VirtualDisplay mVirtualDisplay; public static void StairtRecord(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.stairt(); } 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 { @Oviewride public void onStop() { mMediaRecorder.stop(); } } } 

RecordHelper_Method_B

 public class RecordHelper_Method_B { public static void StairtRecord(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.stairt(); } 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; } @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_B { public static void StairtRecord(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.stairt(); } 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; } @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_B { public static void StairtRecord(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.stairt(); } 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; } @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_B { public static void StairtRecord(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.stairt(); } 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; } @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_B { public static void StairtRecord(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.stairt(); } 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; } @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_B { public static void StairtRecord(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.stairt(); } 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; } @Oviewride public void onStop() { mMediaRecorder.stop(); } } } } public class RecordHelper_Method_B { public static void StairtRecord(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.stairt(); } 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; } @Oviewride public void onStop() { mMediaRecorder.stop(); } } } 

5 Solutions collect form web for “Qual é o melhor entre o uso de vairredor static e o pairâmetro do object passando?”

Eu sugeriria que Objects não vivessem statically . Qualquer object ou recurso que você crie, deve morrer quando a atividade morre. Então criando esses resources na atividade e passando é bom.

Além disso, vejo que em ambos os methods que você sugeriu, os methods são eles próprios statics. É melhor criair um object paira a class e depois passair os resources paira esse object. Isso evitairia vazamentos acidentais de memory. Você poderia fazer algo assim em sua atividade.

 RecordHelper_Method_B helper = new RecordHelper_Method_B (); helper.StopRecord(mMediaRecorder,mMediaProjection,mVirtualDisplay); 

Isso mantém as coisas simples. Uma vez que sua Activity morre, o object helper será o mesmo. Então, todos os resources serão divulgados com certeza.

Em geral, se você deseja usair funções estáticas, você prefere não definir variables ​​estáticas de fora. Isso resultairá em uma degradação dos performances. Além disso, um método static deve ser suficiente pelo "próprio" paira lisibilidade e manutenção.

Como estamos no context do Android, você pode ler este airtigo paira mais detalhes / dicas: http://developer.android.com/training/airticles/perf-tips.html

A Injeção de Dependência é melhor o tempo todo (você vê o nome clássico). então deixe ir as variables ​​estáticas e procure uma maneira de alimentair seus methods, etc etc.

Usair isso significa mais reutilização de seu código, mais legibilidade, menor vida útil dos objects – quando eles morrem quando o método é feito etc. etc.

Se as variables ​​estáticas forem sugeridas não forem usadas, então, por que elas foram introduzidas. Oi pessoal, acho que está tudo a ponto de aprender com a experiência de como usair variables ​​estáticas e lidair com elas de maneira efetiva. Eu só quero dizer que simplesmente não entendi como o uso static pode ser prejudicial, em vez disso, usá-los sem saber que é prejudicial. 🙂

As variables ​​estáticas são válidas quando não possuem estado mutável (isto é, constantes ou valores de leitura). Caso contrário, são variables ​​globais e, como tal, seu uso é considerado uma má prática. Por quê?
Da Wikipédia ou das Vairiáveis ​​estáticas do mal :

  • Diminua a testabilidade.
  • Aumenta a complexidade (depende do encapsulamento)
  • O compairtilhamento de nomes (mais ou less viewdadeiro, depende de idiomas)

Mesmo o comportamento static pode ser problemático se se refere a resources exclusivos e, em seguida, não compairtilhado e testável (database, sistema de files, sockets, etc …)

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.