Получить экземпляр активности

Извините за простой вопрос, я совсем начинающий разработчик Java и Android. Как я могу получить экземпляр Activity в setCameraDisplayOrientation, когда вызывается surfaceChanged?

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);
        ....
    }
    }
}

person RomanKovalev    schedule 15.03.2012    source источник
comment
Зачем нужен его экземпляр. Его переопределенный метод будет иметь некоторый контекст активности. Но все же, если хотите, попробуйте использовать MyActivity.this   -  person Rajkiran    schedule 15.03.2012
comment
Я использую this, но программа вылетает при вызове surfaceChanged. Ok. Я еще раз проверю, почему программа вылетает. Мне нужно, чтобы этот экземпляр вызывал свой метод в контексте: activity.getWindowManager().getDefaultDisplay() .getRotation()   -  person RomanKovalev    schedule 16.03.2012


Ответы (4)


Вот способ избежать утечек памяти с помощью статической переменной: сделать статическую слабую ссылку на экземпляр Activity, который будет установлен в методе onCreate(Bundle).

  1. Напишите в своем вторичном классе что-то вроде ниже:

    public Class SecondClass {
        private static WeakReference<Activity> mActivityRef;
        public static void updateActivity(Activity activity) {
            mActivityRef = new WeakReference<Activity>(activity);
        }
    
  2. Затем в методе onCreate(Bundle) вашего класса Activity:

    @Override
    onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SecondClass.updateActivity(this);
        ...
    }
    
  3. Используйте экземпляр активности следующим образом:

    mActivityRef.get()
    
person Евгений Шевченк&    schedule 19.03.2015
comment
Это путь, если вы хотите сохранить экземпляр Activity в статических переменных и избежать утечек памяти. - person Vincent; 01.12.2015
comment
Это совершенно неправильно, действия Android воссоздаются из-за нехватки памяти, в этом случае вы держите неправильную ссылку на уничтоженное действие !! - person Akash Kava; 10.10.2016
comment
Я имел в виду, что его можно использовать до тех пор, пока память не будет загружена, и его можно будет обновлять каждый раз, когда приложение возвращается на передний план. - person Евгений Шевченк&; 13.10.2016
comment
Miha_x64, синглтон просто модель структуры приложения, которую можно применить к любому объекту как к части структуры приложения. Итак, 1. Этот код работает нормально, и его можно протестировать. 2 - Не говори о том, чего не понимаешь. - person Евгений Шевченк&; 09.03.2017
comment
Я могу подтвердить, что это решает проблемы с утечкой памяти, так как LeakCanary сообщал об утечке памяти до этой реализации, и она исчезла после. - person barnacle.m; 27.02.2018

Activity a = (Activity) getContext();

Пока вы передаете текущую активность в качестве контекста в конструкторе, как вы уже это делаете.

person ivagarz    schedule 03.10.2013

Я просто установил переменную в своем основном действии так... public static Activity activity = this;, тогда я могу ссылаться на нее из любого места, используя: MainActivity.activity.

Вы также можете установить его в методе onCreate(), просто установите переменную в верхней части вашего основного класса активности, например public static Activity activity;, а затем в методе onCreate() просто добавьте activity = this; в любом месте.

Это будет работать для любого класса, который расширяет Activity, например public class MainActivity extends Activity, однако вы можете вызывать переменную из любого класса, даже если они не расширяют Activity.

Надеюсь это поможет.

person Luke Alderton    schedule 10.11.2012
comment
Утечка памяти, как указано ниже - person MLProgrammer-CiM; 18.12.2012
comment
Это определенно может вызвать утечку памяти, сохраняя ссылку на статический контекст (активность). - person dell116; 10.04.2014
comment
Вы не получаете ошибку компиляции Cannot use this in a static context? - person hengxin; 13.05.2014
comment
Пожалуйста, не распространяйте этот метод, так как он приводит к плохому стилю кодирования, сложности в поддержке кодовой базы и различным проблемам, таким как утечка памяти. Надеюсь, люди потратят время на то, чтобы ознакомиться с лучшими практиками Android и шаблонами проектирования. - person mr5; 24.05.2017

Метод this.getParent() работает.

person Gabriel Marques    schedule 17.06.2018