2012-03-15 16 views
14

सरल प्रश्न के लिए क्षमा करें, मैं पूरी तरह से शुरुआती जावा और एंड्रॉइड डेवलपर हूं। सतही चेंज कहा जाता है जब मैं setCameraDisplayOrientation में गतिविधि का उदाहरण कैसे प्राप्त कर सकता हूं?गतिविधि उदाहरण प्राप्त करें

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' का उपयोग करता हूं लेकिन सतह क्रैंग होने पर प्रोग्राम क्रैश होता है। ठीक। मैं फिर से जांच करूंगा क्यों प्रोग्राम क्रैश। मुझे संदर्भ में अपनी विधि को कॉल करने के लिए इस उदाहरण की आवश्यकता है: 'activity.getWindowManager()। GetDefaultDisplay() \t .getRotation()' – psct

उत्तर

16

स्थैतिक चर का उपयोग कर मेमोरी लीक से बचने का एक तरीका यहां है: गतिविधि उदाहरण के लिए स्थैतिक कमजोर संदर्भ बनाएं जिसे क्रेट (बंडल) विधि पर सेट किया जाएगा। नीचे की तरह अपने माध्यमिक वर्ग कुछ में

  1. लिखें:

    @Override 
    onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        SecondClass.updateActivity(this); 
        ... 
    } 
    
  2. उपयोग गतिविधि उदाहरण इस तरह से:

    public Class SecondClass { 
        private static WeakReference<Activity> mActivityRef; 
        public static void updateActivity(Activity activity) { 
         mActivityRef = new WeakReference<Activity>(activity); 
        } 
    
  3. फिर OnCreate (बंडल) अपनी गतिविधि वर्ग की विधि में

    :

    mActivityRef.get() 
    
+0

यदि आप स्थैतिक चर पर स्टोर गतिविधि आवृत्ति चाहते हैं और मेमोरी लीक से बचें तो यह तरीका है – wooohoh

+0

यह पूरी तरह गलत है, एंड्रॉइड गतिविधियों को स्मृति दबाव के तहत फिर से बनाया जाता है, उस स्थिति में, आप नष्ट गतिविधि का गलत संदर्भ रखते हैं !! –

+0

मेरा मतलब था कि इसका उपयोग तब तक किया जा सकता है जब तक कि स्मृति को दबाया न जाए और जब भी ऐप अग्रभूमि पर वापस आ जाए तो उसे अपडेट किया जा सके। –

3

मैं सिर्फ इतना ... public static Activity activity = this; तो मैं इसे कहीं भी उपयोग करने से संदर्भित कर सकते हैं की तरह अपने मुख्य गतिविधि में एक चर सेट: MainActivity.activity

आप इसे ऑनक्रेट() विधि में भी सेट कर सकते हैं, इस public static Activity activity; जैसे अपने मुख्य गतिविधि वर्ग के शीर्ष पर चर सेट अप करें, फिर ऑनक्रेट() विधि में कहीं भी activity = this; जोड़ें।

यह गतिविधि को विस्तारित करने वाली किसी भी कक्षा के लिए काम करेगा, उदाहरण के लिए public class MainActivity extends Activity हालांकि आप वेरिएबल को किसी भी वर्ग से कॉल कर सकते हैं भले ही वे गतिविधि का विस्तार न करें।

उम्मीद है कि इससे मदद मिलती है।

+8

मेमोरी लीक, जैसा कि –

+2

से नीचे बताया गया है, यह निश्चित रूप से एक स्थिर संदर्भ के संदर्भ में स्मृति रिसाव का कारण बन सकता है (वह काम)। – dell116

+2

क्या आप संकलन त्रुटि नहीं प्राप्त करते हैं 'इसे स्थिर संदर्भ में उपयोग नहीं कर सकते'? – hengxin

7
Activity a = (Activity) getContext(); 

जब तक आप वर्तमान गतिविधि को कन्स्ट्रक्टर में संदर्भ के रूप में पास करते हैं, जैसा कि आप पहले से ही कर रहे हैं।

संबंधित मुद्दे