2015-06-22 6 views
8

क्या कोई अंतर है यदि मैं Runnable को runOnUpdateThread() के साथ निष्पादित करता हूं या मैं एक अद्यतन हैंडलर को एक इकाई में पंजीकृत करता हूं और उसके साथ कोड निष्पादित करता हूं?BaseGameActivity.runOnUpdateThread() बनाम Entity.registerUpdateHandler()

मैं Sprite.detachSelf() के साथ दृश्य से Sprite को हटाना चाहता हूं। इस मामले में ट्यूटोरियल का कहना है कि इस विधि को अद्यतन थ्रेड में BaseGameActivity.runOnUpdateThread() के साथ बुलाया जाना चाहिए। लेकिन इस समाधान के साथ मुझे गतिविधि ऑब्जेक्ट को प्रत्येक ऑब्जेक्ट को पास करना होगा जो runOnUpdateThread() का उपयोग करना चाहता है। अच्छा ... मुझे यह पसंद नहीं है।

मेरा प्रश्न है कि अगर मैं एक इकाई में एक RunnableHandler वस्तु बना सकते हैं और registerUpdateHandler() से पंजीकृत करें और नए Runnable RunnableHandler में जोड़ा जाता है, इस समाधान runOnUpdateThread() कार्यक्षमता के साथ समान है। क्या यह Runnable अद्यतन थ्रेड में निष्पादित है?

/* MySprite is attached to a Scene object */ 
public class MySprite extends Sprite { 
    private final RunnableHandler UPDATE_HANDLER = new RunnableHandler(); 

    public MySprite() { 
     registerUpdateHandler(UPDATE_HANDLER); 
    } 

    /* called when the sprite has to be removed from scene */ 
    public void removeMyself() { 
     Runnable r = new Runnable() { 
      public void run() { 
       detachSelf(); 
      } 
     }; 
     UPDATE_HANDLER.postRunnable(r); 
    } 
} 

मैं यह पूछ रहा हूं क्योंकि मानक समाधान के साथ सब कुछ ठीक काम कर रहा है। लेकिन अद्यतन हैंडलर समाधान के साथ मैं इस अपवाद है:

गंभीर अपवाद: UpdateThread java.lang.IndexOutOfBoundsException: अमान्य सूचकांक 19, आकार 19 java.util.ArrayList.throwIndexOutOfBoundsException पर (ArrayList.java:255) java.util.ArrayList.get पर (ArrayList.java:308) org.andengine.entity.Entity.onManagedUpdate (Entity.java:1402) org.andengine.entity.scene.Scene.onManagedUpdate (दृश्य) पर .java: 284) org.andengine.entity.Entity.onUpdate (Entity.java:1167) org.andengine.engine.Engine.onUpdateScene (Engine.java:5291) org.andengine.engine.Engin पर e.onUpdate (Engine.java:5286) org.andengine.engine.Engine.onTickUpdate (Engine.java:5248) org.andengine.engine.Engine $ UpdateThread.run (Engine.java:820)

पर

यह आमतौर पर तब आता है जब अद्यतन थ्रेड में नामक अटैच/डिटेच फ़ंक्शंस नहीं होता है। क्या मैं सही हू? आपकी मदद के लिए अग्रिम धन्यवाद।

+0

आप दृश्य के अंदर अलग-अलग तर्क क्यों नहीं बनाते हैं जिसमें उन sprites शामिल होंगे? आपका दृश्य बेससेन से विस्तारित हो सकता है जिसमें गतिविधि के लिए संदर्भ शामिल है या यदि आप बेससेन दृष्टिकोण नहीं चाहते हैं तो आप उस दृश्य के अंदर अपनी गतिविधि का सप्ताह-निर्धारण भी बना सकते हैं। क्या इनमें से कोई भी दृष्टिकोण आपको अपने लक्ष्यों को प्राप्त करने में मदद करेगा? – GuilhE

+0

हाय गुइल, निश्चित रूप से मैं समस्या को हल करने में सक्षम था। लेकिन मेरा सवाल बिल्कुल अलग था। मुझे समझ में नहीं आया कि मैंने उपरोक्त अपवाद क्यों प्राप्त किया जब मैंने चित्रित कोड का उपयोग किया। क्या पंजीकृत अद्यतन हैंडलर कोड वास्तव में अपडेट थ्रेड में लगाया गया है जैसा कि मैंने उम्मीद की थी या नहीं? यदि नहीं, तो क्यों नहीं? – albundyszabolcs

उत्तर

2

Entity में स्रोत कोड को देखते हुए एक सिद्धांत क्या होता है:

  1. दिखाया लाइन, एक इकाई गिनती ऊपर उठाता है = 19 (लॉग से)
  2. entity.get में से एक (i) .onUpdate() कॉल हटाएं स्वयं()
  3. अलग करने के लिए रनने योग्य स्वयं कतारबद्ध है।
  4. अगले entity.get (i) .onUpdate() UpdateHandler में परिणाम होगा पर (updatehandlers onManagedUpdate में चलाए जा रहे हैं)
  5. detachSelf माता पिता सूची (फोन करने वाले) (से बच्चे को हटा onUpdate के माध्यम से चलाने के लिए जहां प्रविष्टि गिनती अभी भी 1 9 है लेकिन mChildren/entities की लंबाई अब 18 है)

कोड को देखने से सिर्फ एक सिद्धांत ... मुझे लगता है कि उत्तर पाने के लिए एक अच्छा बिंदु लूप को देखना है Entity और देखें कि लूप के दौरान 'इकाइयों' को संशोधित किया गया है या नहीं।(नोट: 'अंतिम संस्थाएं' सूची को संशोधित नहीं करने के लिए पुन: असाइन करने वाले चर को रोकती है)

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