2012-03-15 7 views
14

Scusami per la semplice domanda, sono completamente sviluppatore java e Android per principianti. Come posso ottenere l'istanza di Activity in setCameraDisplayOrientation quando viene chiamato surfaceChanged?Ottieni istanza attività

public class MyActivity extends Activity 
{ 
    private Camera mCamera; 
    private CameraPreview mPreview; 
    public final int cameraId = 0; 
    public Activity activity = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

    activity = this; 

     // Create an instance of Camera 
     mCamera = getCameraInstance(); 

     // Create our Preview view and set it as the content of our activity. 
     mPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     preview.addView(mPreview); 
    } 

    public void setCameraDisplayOrientation(Activity activity, 
         int cameraId, android.hardware.Camera camera) { 

    } 

    public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 
    ... 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     ... 
     setCameraDisplayOrientation(activity, cameraId, mCamera); 
     .... 
    } 
    } 
} 
+0

Perché è necessaria la sua istanza. Il suo metodo sovrascritto, avrà un certo contesto di attività. Ma se vuoi, prova a usare 'MyActivity.this' – Rajkiran

+0

Io uso' this' ma il crash del programma quando surfaceChanged ha chiamato. Ok. Controllerò di nuovo il motivo del crash del programma. Ho bisogno di questa istanza per chiamare il suo metodo nel contesto: 'activity.getWindowManager(). GetDefaultDisplay() \t .getRotation()' – psct

risposta

16

Ecco un modo per evitare perdite di memoria utilizzando la variabile statica: creare un riferimento statico debole all'istanza di Attività che verrà impostata nel metodo onCreate (Bundle).

  1. Scrivi nella tua classe qualcosa di secondario come di seguito:

    public Class SecondClass { 
        private static WeakReference<Activity> mActivityRef; 
        public static void updateActivity(Activity activity) { 
         mActivityRef = new WeakReference<Activity>(activity); 
        } 
    
  2. Poi, nel metodo onCreate (Bundle) della Classe di attività:

    @Override 
    onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        SecondClass.updateActivity(this); 
        ... 
    } 
    
  3. esempio Utilizzare l'attività in questo modo:

    mActivityRef.get() 
    
+0

Questa è la strada da percorrere se si desidera archiviare l'istanza di attività su variabili statiche ed evitare perdite di memoria – wooohoh

+0

Questo è completamente sbagliato, le attività di Android vengono ricreate sotto pressione di memoria, in questo caso si sta tenendo un riferimento errato dell'attività distrutta !! –

+0

Intendevo dire che poteva essere usato fino a quando la memoria non fosse sotto pressione e potrebbe essere aggiornato ogni volta che l'app tornerà in primo piano. –

3

Ho appena impostare una variabile nella mia attività principale in questo modo ... public static Activity activity = this; poi posso farvi riferimento da qualsiasi luogo utilizzando: MainActivity.activity.

È anche possibile impostare nel metodo onCreate(), è sufficiente impostare la variabile nella parte superiore della classe principale attività come questo public static Activity activity; poi nel metodo onCreate() basta aggiungere activity = this; ovunque.

Questo funzionerà per qualsiasi classe che estende Attività, ad esempio public class MainActivity extends Activity tuttavia è possibile chiamare la variabile da qualsiasi classe anche se non estende l'attività.

Spero che questo aiuti.

+8

Perdita di memoria, come indicato di seguito –

+2

Questo può sicuramente causare perdite di memoria facendo riferimento a un contesto statico (l'attività). – dell116

+2

Non si ottiene l'errore di compilazione 'Non è possibile utilizzarlo in un contesto statico? – hengxin

7
Activity a = (Activity) getContext(); 

Fintanto che si passa l'attività corrente come contesto nel costruttore, come si sta già facendo.

Problemi correlati