2011-08-15 31 views
7

में थ्रेड को पुनरारंभ/रोकना मेरे पास एक ऐसा गेम है जो ऑब्जेक्ट्स को प्रदर्शित करने के लिए SurfaceView कार्यान्वयन का उपयोग करता है। मेरे पास एक थ्रेड है जो स्क्रीन पर SurfaceView समय-समय पर खींचता है। खेल पूरी तरह से चल रहा है। दुर्भाग्य से, गेम को बाधित होने पर इसे रोक फ़ंक्शन करने की आवश्यकता होती है। ठीक है, मुझे पता है कि मुझे onResume और में हेरफेर करने की आवश्यकता है।ऑनर्यूज़/थ्रॉज़

लेकिन मुझे यह सही नहीं मिल रहा है। त्रुटि मुझे surfaceCreated पर इंगित करती है जहां मैं धागा को बताता हूं कि धागा पहले ही शुरू हो चुका है। मैंने resume और suspend का उपयोग क्रमशः onResume और पर करने की कोशिश की लेकिन कुछ भी नहीं बदला।

मैं इसे कैसे प्राप्त कर सकता हूं? मैंने पहले ही यह किया है कि फ़ाइल-I/O हैंडलिंग का उपयोग करके वस्तुओं का स्थान कैसे सहेजा जाएगा।

अग्रिम धन्यवाद।

+0

संभावित डुप्लिकेट [एंड्रॉइड में थ्रेड कैसे रोकें/फिर से शुरू करें?] (Http://stackoverflow.com/questions/6776327/how-to-pause-resume-thread-in-android) – Wroclai

+0

दुख की बात है। यह काम नहीं किया। –

उत्तर

1

आपके कोड के इन-आउट और आउट को जानने के बिना।

"रोकें" करने के लिए एक धागा तुम इतनी तरह की कार्यक्षमता को लागू कर सकते हैं:

while(! this.isInterrupted()) 
    if(!paused) 
    { 
     ... Do something ... 
    } else { try { Thread.sleep(100) } catch (InteruptedException ie) {} } 

यह अगर Do something अपने सतह दृश्य अमान्य है या अन्यथा आपकी ऐप्लिकेशन में प्रगति को नियंत्रित निर्भर करता है। paused पर एक एक्सेसर आपको किसी अन्य बिट आर्किटेक्चर में पकड़े बिना अपने धागे को रोक और फिर से शुरू करने की अनुमति दे सकता है।

2

असल में आपके द्वारा धागे को रोकने की अनुशंसा नहीं की जाती है, stop() विधि बहिष्कृत की जाती है। सबसे आसान समाधान थ्रेड के run() विधि के अंदर अपने while लूप में ध्वज का उपयोग करना है। जब आपको धागे को "रोकना" की आवश्यकता होती है, तो आप ध्वज को झूठ में छोड़ देते हैं और थ्रेड चलने के बावजूद थ्रेड अब और कुछ नहीं करेगा। जब आवश्यक हो तो एंड्रॉइड आपके थ्रेड को रोक देगा। उम्मीद है की यह मदद करेगा।

+0

ठीक है, फिर मैं थ्रेड को फिर से शुरू कैसे करूंगा जब मैंने चल रहे ध्वज को 'ऑन पॉज़' से गलत पर सेट किया है। –

+0

@ कैरिल होराड, आपका आवेदन एक ही काम के साथ एक और धागा शुरू करेगा – Egor

+0

एक और थ्रेड शुरू करना? लेकिन क्या यह शुरुआत से कार्य शुरू करने वाला नहीं है? –

3

यह मैं क्या किया है:

@Override 
    public void surfaceCreated(SurfaceHolder arg0) { 
      if (thread.getState() == Thread.State.TERMINATED){ 
       CreateThread(getHolder(),getContext()); 
      } 
      thread.setRunning(true); 
      thread.start(); 
    } 
  • CreateThread में आप धागा = नए MyThread (...) होनी चाहिए;
  • सेटरिंग (बूलियन एमआरयूएन) रन फ़ंक्शन को शुरू/बंद करने के लिए एक बुलियन का उपयोग करता है (मुझे लगता है कि मैं चंद्र लैंडर से प्रेरित था);

यदि आप ठीक से उपयोग करना चाहते हैं तो ऑनपॉज़/ऑनर्यूसम थ्रेड के अंदर अपने धागे द्वारा उपयोग किए जाने वाले वेरिएबल को नहीं डालें (जैसा कि लुनरलैंडर में किया गया है)। मेरा सुझाव है कि आप ऐसा करने के लिए:

// Variables declarations 

public MyGameThread CreateThread(...){ 
thread = new MyGameThread(holder, context, new Handler() { 
// and so on.... 
}); 
} 

जब आप onPause/onResume के माध्यम से पारित, अपने धागा नष्ट कर दिया जाएगा और reneweled लेकिन यदि आप इसे बाहर अपने चर डाल दिया, आप के बाद उन्हें इस्तेमाल करने के लिए जारी कर सकते हैं।

आप संरक्षित करने के लिए कुछ महत्वपूर्ण है, तो यह विकल्पों में से एक का उपयोग करें:

  • SharedPreferences: एक xml बनाया है और चर कि एप्लिकेशन के अंत के बाद भी जारी रहती है साथ स्थानीय रूप से सहेज लिया जाएगा;
  • एक एसक्यूएल डीबी यदि आप 5-10 से अधिक चर का प्रबंधन करेंगे क्योंकि इस मामले में पूर्व विकल्प का उपयोग करना मुश्किल होगा।
+0

क्या आप इसे आगे बढ़ा सकते हैं? मैं इसके माध्यम से नहीं जा सकता। देरी से जवाब देने के लिए माफी। –

+0

ठीक है, इस ब्लॉग का अध्ययन शुरू करें: http://wonton-games.blogspot.com/2010/06/lunar-lander-resume-game-workaround.html मुझे वहां "चंद्रभूमि समस्या" के बारे में बहुत कुछ मिला है। उसके बाद, एक विस्तृत प्रश्न के साथ वापस आओ;) – Zappescu

1

मैं अनिश्चित हूँ अगर आप इस सवाल में एक या दो धागे मिल गया है, मैं 2. संभालने कर रहा हूँ आप तीन काम करने के लिए जब आप onPause फोन की जरूरत है:

1 - Save the state of the application (all game variables, states, etc) 
2 - Kill the surfaceView by calling suspend. 
3 - Kill the other thread (we'll call it Thread B). 

थ्रेड की हत्या बी आपकी समस्या है मुझे लगता है। आप धागे को बाधित करना चाहते हैं और इसे छोड़ने के लिए कहें, या फिर जब आप कॉल करते हैं तो आपका धागा अभी भी अपनी बात कर रहा है। फिर, जब आप खेल में वापस जाते हैं, तो थ्रेड फिर से बनने की कोशिश करेगा जो समस्या का कारण बनता है।

  • अपने धागे की while() पाश में एक बूलियन 'रन' जो while(run) कोड निष्पादित होगा,: एक धागा ठीक से मारने के लिए 2 तरीके हैं। जब आप गलत में रन बदलते हैं, तो थ्रेड निकलता है।
  • यदि आपका धागा सोता है (मुझे लगता है कि यह एक गेम के बाद से हो सकता है और w.r.t समय चल रहा होगा), InterruptedException पकड़ें और फिर वहां से बाहर निकलें। जब आप धागे को मारना चाहते हैं, तो आप अपवाद को धागे में फेंक देते हैं।

पहला सबसे आसान है।