2009-03-23 10 views
5

का उपयोग कर फोकस प्राप्त करना मैं वर्तमान में चंद्र लैंडर नमूना के साथ खेल रहा हूं, एंड्रॉइड के साथ पकड़ने जा रहा हूं।एंड्रॉइड: SurfaceView

मुझे पता चला है कि यदि आप ऐप से दूर नेविगेट करते हैं (उदाहरण के लिए, कॉल बटन दबाएं) तो यह अंतर्निहित सतह को नष्ट कर देगा (surfaceDestroyed पर कॉल करना)।

वापस नेविगेट करना (जो onWindowVisibilityChanged ट्रिगर करेगा) ऐप क्रैश हो जाएगा, क्योंकि यह बिना किसी पुनर्निर्माण के सतह पर आकर्षित करने का प्रयास करेगा।

क्या कोई कोड है जिसे मैं onWindowVisibilityChanged (या कहीं और) में डाल सकता हूं जो SurfaceView की अंतर्निहित सतह को पुन: उत्पन्न करेगा और निष्पादन को अच्छी तरह से फिर से शुरू करेगा?

ऐसा लगता है कि यह एक साधारण फ़ंक्शन कॉल होना चाहिए लेकिन मुझे एपीआई दस्तावेज़ों में कुछ भी नहीं मिल रहा है।

धन्यवाद!

उत्तर

1

गलत निदान! ऐप स्वचालित रूप से सतह को फिर से बनाता है, लेकिन वहां एक कॉल है जो इसे बनाने से पहले इसे आकर्षित करने का प्रयास करती है।

समस्या फिक्सिंग:

boolean mSurfaceExists; 
... 
public void surfaceDestroyed(SurfaceHolder holder) { 
    mSurfaceExists = false; 
    ... 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    mSurfaceExists = true; 
    ... 
} 

protected void onWindowVisibilityChanged(int visibility) { 
    // only call base if there's a surface 
    if(mSurfaceExists) 
     super.onWindowVisibilityChanged(visibility); 
} 

अब यह सब प्रफुल्लित है। (जहां तक ​​मुझे पता है, वैसे भी - जावा/एंड्रॉइड विशेषज्ञ टिप्पणी करने के लिए स्वतंत्र महसूस करते हैं यदि यह खराब अभ्यास है!)

+0

मैंने यह कोशिश की है और यह चंद्र लैंडर गेम को ठीक से नहीं खींचता है। आपको जो भी मिलता है वह वह स्थान है जो अंतरिक्ष जहाज या पृष्ठभूमि नहीं है। –

2

"mSurfaceExists = true" के लिए यह समाधान मेरे लिए काम नहीं कर रहा है। यह सतह की तरह दिखता है() को कॉल नहीं किया जा रहा है क्योंकि super.onWindowVisibilityChanged() को नहीं कहा जाता है। तो वहां कोई सतह नहीं बनाई गई है और यह क्रैश नहीं होती है क्योंकि threas.start को नहीं कहा जाता है।

मुझे विश्वास है कि समस्या यह है: कॉलिंग thread.start() त्रुटि का कारण बनता है क्योंकि थ्रेड पहले ही शुरू हो चुका था। लेकिन सतह में Destroyed(), thread.join धागे को पूरा करने और मरने का कारण बनता है। और एक धागा मृत होने के बाद पुनरारंभ नहीं किया जा सकता है।

मैं अनुमान लगा रहा हूं कि चाल सतह पर एक नया धागा बनाना है या केवल थ्रेड को पूरा करने का कारण है जब उपयोगकर्ता एप्लिकेशन को समाप्त करने के लिए कॉल कर रहा है (बैक की) और रोक नहीं रहा (होम कुंजी)। गतिविधि पर फ़िनिशिंग() को कॉल करके चेक किया जा सकता है।

यह सुनिश्चित नहीं है कि यह काम करेगा या नहीं। मैं जल्द ही कोशिश करूँगा।

+0

बस परीक्षण किया गया (इसे डीबग किया गया) और जैसा कि आपने माना था। 'AppDroyroyed() 'जैसे ही ऐप छुपाया जाता है और थ्रेड बंद हो जाता है। ऐप को फिर से दिखाते समय, 'सतहक्रेटेड()' को बुलाया जाता है और फिर थ्रेड को फिर से शुरू करने का प्रयास करता है, जिसके परिणामस्वरूप 'अवैध थ्रेडस्टेट अपवाद' होता है। – Ridcully

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