2012-03-15 41 views
14

Xin lỗi vì câu hỏi đơn giản, tôi là người phát triển java và android hoàn toàn mới bắt đầu. Làm thế nào tôi có thể có được thể hiện của hoạt động trong setCameraDisplayOrientation khi surfaceChanged được gọi là?Lấy ví dụ hoạt động

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

Tại sao bạn cần trường hợp của nó. Phương pháp ghi đè của nó, nó sẽ có một số bối cảnh hoạt động. Nhưng vẫn còn nếu bạn muốn, hãy thử sử dụng 'MyActivity.this' – Rajkiran

+0

Tôi sử dụng' this' nhưng chương trình sụp đổ khi surfaceChanged gọi. Được. Tôi sẽ kiểm tra lại lý do tại sao chương trình bị lỗi. Tôi cần trường hợp này để gọi phương thức của nó trong ngữ cảnh: 'activity.getWindowManager(). GetDefaultDisplay() \t .getRotation()' – psct

Trả lời

16

Đây là cách để tránh rò rỉ bộ nhớ bằng biến tĩnh: tạo tham chiếu yếu tĩnh cho thể hiện Hoạt động sẽ được đặt trong phương thức onCreate (Bundle).

  1. Viết trong lớp học một cái gì đó phụ của bạn như dưới đây:

    public Class SecondClass { 
        private static WeakReference<Activity> mActivityRef; 
        public static void updateActivity(Activity activity) { 
         mActivityRef = new WeakReference<Activity>(activity); 
        } 
    
  2. Sau đó, trong phương pháp onCreate (Bundle) của lớp Hoạt động của bạn:

    @Override 
    onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        SecondClass.updateActivity(this); 
        ... 
    } 
    
  3. Sử dụng hoạt động ví dụ như sau:

    mActivityRef.get() 
    
+0

Đây là cách để đi nếu bạn muốn lưu trữ hoạt động trên biến tĩnh và tránh rò rỉ bộ nhớ – wooohoh

+0

Điều này là hoàn toàn sai, hoạt động Android được tái tạo dưới áp lực bộ nhớ, trong trường hợp đó, bạn đang nắm giữ một tham chiếu sai của hoạt động bị phá hủy !! –

+0

Tôi có nghĩa là nó có thể được sử dụng cho đến khi bộ nhớ sẽ bị áp lực và có thể được cập nhật mỗi khi ứng dụng returnd để foreground. –

3

Tôi chỉ cần thiết lập một biến trong hoạt động chính của tôi như vậy ... public static Activity activity = this; sau đó tôi có thể tham khảo nó từ bất cứ nơi nào sử dụng: MainActivity.activity.

Bạn cũng có thể đặt nó trong phương thức onCreate(), chỉ cần thiết lập biến ở đầu lớp hoạt động chính của bạn như thế này public static Activity activity; sau đó trong phương thức onCreate() chỉ cần thêm activity = this; vào bất kỳ đâu.

Điều này sẽ làm việc cho bất kỳ lớp nào mở rộng Hoạt động, ví dụ: public class MainActivity extends Activity tuy nhiên bạn có thể gọi biến từ bất kỳ lớp nào ngay cả khi chúng không mở rộng Hoạt động.

Hy vọng điều này sẽ hữu ích.

+8

Rò rỉ bộ nhớ, như đã nêu dưới đây –

+2

Điều này chắc chắn có thể gây rò rỉ bộ nhớ bằng cách giữ tham chiếu đến một ngữ cảnh tĩnh (hoạt động). – dell116

+2

Bạn không nhận được lỗi biên dịch 'Không thể sử dụng điều này trong một bối cảnh tĩnh'? – hengxin

7
Activity a = (Activity) getContext(); 

Miễn là bạn chuyển hoạt động hiện tại làm ngữ cảnh trong hàm tạo, như bạn đã làm.

Các vấn đề liên quan