รับตัวอย่างกิจกรรม

ขอโทษสำหรับคำถามง่ายๆ ฉันเป็นนักพัฒนา Java และ Android มือใหม่โดยสมบูรณ์ ฉันจะรับอินสแตนซ์ของกิจกรรมใน 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 ตกลง. ฉันจะตรวจสอบอีกครั้งว่าทำไมโปรแกรมขัดข้อง ฉันต้องการอินสแตนซ์นี้เพื่อเรียกวิธีการตามบริบท: activity.getWindowManager().getDefaultDisplay() .getRotation()   -  person RomanKovalev    schedule 16.03.2012


คำตอบ (4)


ต่อไปนี้เป็นวิธีหลีกเลี่ยงหน่วยความจำรั่วไหลโดยใช้ตัวแปรแบบคงที่: สร้างการอ้างอิงแบบคงที่ที่ไม่รัดกุมไปยังอินสแตนซ์กิจกรรมที่จะตั้งค่าในวิธี 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) ของคลาสกิจกรรมของคุณ:

    @Override
    onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SecondClass.updateActivity(this);
        ...
    }
    
  3. ใช้อินสแตนซ์กิจกรรมด้วยวิธีนี้:

    mActivityRef.get()
    
person Евгений Шевченк&    schedule 19.03.2015
comment
นี่คือวิธีที่จะไปหากคุณต้องการจัดเก็บอินสแตนซ์กิจกรรมบนตัวแปรคงที่และหลีกเลี่ยงหน่วยความจำรั่ว - person Vincent; 01.12.2015
comment
นี่เป็นสิ่งที่ผิดโดยสิ้นเชิง กิจกรรม Android ถูกสร้างขึ้นใหม่ภายใต้แรงกดดันของหน่วยความจำ ในกรณีนี้ คุณกำลังอ้างอิงกิจกรรมที่ถูกทำลายผิด !! - person Akash Kava; 10.10.2016
comment
ฉันหมายความว่ามันสามารถใช้งานได้จนกว่าหน่วยความจำจะถูกกดดันและสามารถอัปเดตได้ทุกครั้งที่แอปกลับสู่เบื้องหน้า - person Евгений Шевченк&; 13.10.2016
comment
Miha_x64, singleton เป็นเพียงโมเดลโครงสร้างแอปที่สามารถนำไปใช้กับออบเจ็กต์ใด ๆ โดยเป็นส่วนหนึ่งของโครงสร้างแอป ดังนั้น 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