2012-03-15 15 views
14

Disculpe por una simple pregunta, soy completamente principiante java y desarrollador de Android. ¿Cómo puedo obtener la instancia de Activity en setCameraDisplayOrientation cuando se llama a SurfaceChanged?Obten la instancia de actividad

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

Por qué necesita su instancia. Su método anulado, tendrá algún contexto de actividad. Pero aún así, si lo desea, intente con 'MyActivity.this' – Rajkiran

+0

Utilizo' this' pero el programa falla cuando se llama a surfaceChanged. De acuerdo. Comprobaré de nuevo por qué falla el programa. Necesito esta instancia para llamar a su método en contexto: 'activity.getWindowManager(). GetDefaultDisplay() \t .getRotation()' – psct

Respuesta

16

Aquí hay una manera de evitar fugas de memoria con la variable estática: hacer referencia débil estática a la instancia de actividad que se establecerá en el método onCreate (Bundle).

  1. Escriba en su clase algo secundario, como a continuación:

    public Class SecondClass { 
        private static WeakReference<Activity> mActivityRef; 
        public static void updateActivity(Activity activity) { 
         mActivityRef = new WeakReference<Activity>(activity); 
        } 
    
  2. A continuación, en el método onCreate (Bundle) de la clase Actividad:

    @Override 
    onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        SecondClass.updateActivity(this); 
        ... 
    } 
    
  3. instancia Uso actividad de esta manera:

    mActivityRef.get() 
    
+0

Este es el camino a seguir si desea almacenar instancia de actividad en variables estáticas y evitar fugas de memoria – wooohoh

+0

Esto es totalmente incorrecto, las actividades de Android se recrean bajo presión de memoria, en ese caso, ¡está reteniendo una referencia incorrecta de actividad destruida! –

+0

Quise decir que podría usarse hasta que la memoria se presione y se pueda actualizar cada vez que la aplicación regrese al primer plano. –

3

Acabo de crear una variable en mi actividad como tal ... public static Activity activity = this; entonces puede hacer referencia a ella desde cualquier lugar usando: MainActivity.activity.

También puede configurarlo en el método onCreate(), simplemente configure la variable en la parte superior de su clase de actividad principal como public static Activity activity; y luego en el método onCreate() simplemente agregue activity = this; en cualquier lugar.

Esto funcionará para cualquier clase que amplíe la actividad, por ejemplo public class MainActivity extends Activity, sin embargo, puede llamar a la variable de cualquier clase, incluso si no amplían la actividad.

Espero que esto ayude.

+8

Fuga de memoria, como se indica a continuación –

+2

Esto definitivamente puede causar pérdidas de memoria al hacer referencia a un contexto estático (la actividad). – dell116

+2

¿No obtiene el error de compilación 'No se puede usar esto en un contexto estático'? – hengxin

7
Activity a = (Activity) getContext(); 

Siempre que pase la actividad actual como contexto en el constructor, como ya lo está haciendo.

Cuestiones relacionadas