Dapatkan contoh aktivitas

Maaf untuk pertanyaan sederhana, saya benar-benar pengembang Java dan Android pemula. Bagaimana saya bisa mendapatkan instance Aktivitas di setCameraDisplayOrientation saat SurfaceChanged dipanggil?

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 sumber
comment
Mengapa Anda memerlukan contohnya. Metodenya yang diganti, akan memiliki beberapa konteks aktivitas. Tapi tetap saja kalau mau, coba gunakan MyActivity.this   -  person Rajkiran    schedule 15.03.2012
comment
Saya menggunakan this tetapi program mogok ketika SurfaceChanged dipanggil. Oke. Saya akan memeriksa lagi mengapa program macet. Saya memerlukan instance ini untuk memanggil metodenya dalam konteks: activity.getWindowManager().getDefaultDisplay() .getRotation()   -  person RomanKovalev    schedule 16.03.2012


Jawaban (4)


Berikut adalah cara untuk menghindari kebocoran memori menggunakan variabel statis: buat referensi lemah statis ke instance Aktivitas yang akan disetel dalam metode onCreate(Bundle).

  1. Tulislah di kelas menengah Anda sesuatu seperti di bawah ini:

    public Class SecondClass {
        private static WeakReference<Activity> mActivityRef;
        public static void updateActivity(Activity activity) {
            mActivityRef = new WeakReference<Activity>(activity);
        }
    
  2. Kemudian dalam metode onCreate(Bundle) kelas Aktivitas Anda:

    @Override
    onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SecondClass.updateActivity(this);
        ...
    }
    
  3. Gunakan contoh aktivitas dengan cara ini:

    mActivityRef.get()
    
person Евгений Шевченк&    schedule 19.03.2015
comment
Ini adalah cara yang harus dilakukan jika Anda ingin menyimpan instance Aktivitas pada variabel statis & menghindari kebocoran memori - person Vincent; 01.12.2015
comment
Ini benar-benar salah, aktivitas Android dibuat ulang di bawah tekanan memori, dalam hal ini, Anda memegang referensi yang salah tentang aktivitas yang dimusnahkan !! - person Akash Kava; 10.10.2016
comment
Maksud saya ini dapat digunakan hingga memori tertekan dan dapat diperbarui setiap kali aplikasi kembali ke latar depan. - person Евгений Шевченк&; 13.10.2016
comment
Miha_x64, singleton hanyalah model struktur aplikasi yang dapat diterapkan ke objek apa pun sebagai bagian struktur aplikasi. Jadi 1 - Kode ini berfungsi dengan baik dan dapat diuji. 2 - Jangan mengatakan hal-hal yang tidak Anda mengerti. - person Евгений Шевченк&; 09.03.2017
comment
Saya dapat mengonfirmasi bahwa ini menyelesaikan masalah kebocoran memori, karena LeakCanary melaporkan kebocoran memori sebelum penerapan ini, dan kebocoran tersebut hilang setelahnya. - person barnacle.m; 27.02.2018

Activity a = (Activity) getContext();

Selama Anda meneruskan aktivitas saat ini sebagai konteks di konstruktor, seperti yang sudah Anda lakukan.

person ivagarz    schedule 03.10.2013

Saya baru saja menetapkan variabel di aktivitas utama saya seperti ini... public static Activity activity = this; lalu saya dapat mereferensikannya dari mana saja menggunakan: MainActivity.activity.

Anda juga dapat menyetelnya di metode onCreate(), cukup siapkan variabel di bagian atas kelas aktivitas utama Anda seperti ini public static Activity activity; lalu di metode onCreate() tambahkan saja activity = this; di mana saja.

Ini akan berfungsi untuk kelas mana pun yang memperluas Aktivitas, misalnya public class MainActivity extends Activity namun Anda dapat memanggil variabel dari kelas mana pun meskipun kelas tersebut tidak memperluas Aktivitas.

Semoga ini membantu.

person Luke Alderton    schedule 10.11.2012
comment
Kebocoran memori, seperti yang dinyatakan di bawah ini - person MLProgrammer-CiM; 18.12.2012
comment
Hal ini pasti dapat menyebabkan kebocoran memori dengan tetap mengacu pada konteks statis (aktivitas). - person dell116; 10.04.2014
comment
Apakah Anda tidak mendapatkan kesalahan kompilasi Cannot use this in a static context? - person hengxin; 13.05.2014
comment
Mohon jangan menyebarkan teknik semacam ini karena menghasilkan gaya pengkodean yang buruk, basis kode yang sulit dipelihara, dan berbagai masalah seperti kebocoran memori. Semoga orang-orang meluangkan waktu untuk membaca praktik terbaik dan pola desain Android. - person mr5; 24.05.2017

Metode this.getParent() berfungsi.

person Gabriel Marques    schedule 17.06.2018