2012-03-15 13 views
14

私は簡単な質問のためにすみません、私は完全に初心者のJavaとアンドロイドの開発者です。 surfaceChangedが呼び出されたときに、setCameraDisplayOrientationでActivityのインスタンスを取得する方法は?そう... public static Activity activity = this;が、私はどこでも使用してからそれを参照することができるようにアクティビティインスタンスを取得

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

なぜインスタンスが必要ですか。そのオーバーライドされたメソッドは、いくつかのアクティビティコンテキストを持ちます。でも、もしあなたが望むなら、 'MyActivity.this'を使ってみてください。 – Rajkiran

+0

私は' this'を使っていますが、surfaceChangedが呼び出されたときにプログラムがクラッシュします。 OK。なぜプログラムがクラッシュするのか再度確認します。私はこのインスタンスをコンテキストで呼び出す必要があります: 'activity.getWindowManager()。getDefaultDisplay() \t .getRotation()' – psct

答えて

16

ここでは、静的変数を使用してメモリリークを回避する方法を示します。onCreate(Bundle)メソッドで設定されるActivityインスタンスへの静的弱参照を作成します。

  1. あなたの二次クラスの書き込み以下のようなもの:あなたのActivityクラスののonCreate(バンドル)メソッドで次に

    public Class SecondClass { 
        private static WeakReference<Activity> mActivityRef; 
        public static void updateActivity(Activity activity) { 
         mActivityRef = new WeakReference<Activity>(activity); 
        } 
    
  2. @Override 
    onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        SecondClass.updateActivity(this); 
        ... 
    } 
    
  3. 使用アクティビティインスタンスこの方法:

    mActivityRef.get() 
    
+0

静的変数にアクティビティインスタンスを保存してメモリリークを避けたい場合にはこれを行う方法です – wooohoh

+0

これは完全に間違っています。その場合、メモリの負荷の下でAndroidのアクティビティが再作成されます。 –

+0

私は、メモリが圧迫され、アプリがフォアグラウンドに戻るたびに更新されるまで使用できることを意味しました。 –

3

は、私はちょうど私の主な活動に変数を設定します。MainActivity.activity

また、onCreate()メソッドで設定することもできます。これは、メインアクティビティクラスの先頭に変数public static Activity activity;を設定してから、onCreate()メソッドでactivity = this;を追加するだけです。

Activityを拡張するすべてのクラス(たとえば、public class MainActivity extends Activity)でも動作しますが、アクティビティを拡張しない場合でも、どのクラスからでも変数を呼び出すことができます。

これが役に立ちます。

+8

以下に述べるようにメモリリーク –

+2

これは間違いなく静的コンテキストアクティビティ)。 – dell116

+2

コンパイルエラー「静的コンテキストで使用できません」が表示されませんか? – hengxin

7
Activity a = (Activity) getContext(); 

あなたが既に行っているように、現在のアクティビティをコンストラクタのコンテキストとして渡す限りです。

関連する問題