2011-12-09 11 views
5

के साथ सिंक्रनाइज़ेशन मैं एंड्रॉइड ऐप में ड्राइंग करने के लिए ओपनजीएल ईएस का उपयोग कर रहा हूं।एंड्रॉइड: ओपनजीएल रेंडरर थ्रेड

मैं यूआई थ्रेड से बुलाया गया एक फ़ंक्शन लिखना चाहता हूं जो रेंडरर थ्रेड को कॉल करेगा और इसे कॉलर को छवि को पढ़ने और वापस करने के लिए प्राप्त करेगा।

मैं Future का उपयोग करने के बारे में सोच रहा था ताकि यूआई थ्रेड सो जाएगा, जबकि रेंडरर थ्रेड छवि डेटा लिखता है (वह ऑपरेशन बहुत तेज़ है, इसलिए उपयोगकर्ता ऐसा महसूस नहीं करेगा कि ऐप अनुत्तरदायी बन गया है)।

लेकिन मुझे प्रस्तुतकर्ता थ्रेड में भविष्य को सबमिट करने के तरीके के बारे में एक नुकसान है। मैंने पाया सभी उदाहरण अपने स्वयं के धागे बनाते हैं और फिर भविष्य को इन धागे में जमा करते हैं। GLSurfaceView के बारे में प्रलेखन का उल्लेख है "क्यूईएवेंट() विधि का उपयोग UI थ्रेड और प्रतिपादन थ्रेड के बीच सुरक्षित रूप से संवाद करने के लिए किया जाता है। यदि आप चाहें, तो आप कुछ अन्य जावा क्रॉस-थ्रेड संचार तकनीक का उपयोग कर सकते हैं, जैसे कि रेंडरर क्लास पर सिंक्रनाइज़ किए गए तरीके । " तो ऐसा लगता है कि queueEvent() पर कॉल करने के बजाय भविष्य का उपयोग करना संभव है, लेकिन मुझे नहीं पता कि यह कैसे करना है।

उत्तर

7

तेरा यह, मैं यह परीक्षण नहीं किया है, तो काम नहीं कर सकते:

FutureTask<YourReturnObject> futureTask = new FutureTask<YourReturnObject>(new Callable<YourReturnObject>() { 
    @Override 
    public YourReturnObject call() throws Exception { 
     //your gl stuff here 
     return // result 
    } 
}); 
glSurfaceView.queueEvent(futureTask); 
YourReturnObject result=futureTask.get(); // should block until gl thread is done. 
4

मैं GLSurfaceView का विस्तार नहीं है, लेकिन बजाय धागे के बीच अतुल्यकालिक संचार कर रही सुझाव देना चाहेंगे। कुछ उदाहरणों के लिए answer here देखें

अनिवार्य रूप से आप इसे GLSurfaceView.Renderer के कार्यान्वयन में कार्यों को कतारबद्ध करते हैं। फिर, जब जीएल थ्रेड रेंडरर में आपकी ऑनड्रा() विधि को कॉल करता है, तो आप उन कतारबद्ध कार्यों को निष्पादित करते हैं। कार्यों को पूरा करते समय, Handler

का उपयोग करके कार्य पूरा होने वाले अन्य धागे को इंगित करें, फिर भी यूआई थ्रेड को न सोएं। यदि यूआई थ्रेड सो जाता है, तो एंड्रॉइड ओएस को इससे कोई प्रतिक्रिया नहीं मिलती है और गलत तरीके से पता चलता है कि ऐप क्रैश हो गया है, (एक अनंत लूप या कुछ में पकड़ा गया है) और उपयोगकर्ता को

पर एक फोर्स क्लोज़ वार्तालाप फेंक देगा
संबंधित मुद्दे