2012-10-27 22 views
5

मेरे पास निम्नलिखित कोड है।एंड्रॉइड, हैंडलर मुख्य धागे या अन्य थ्रेड में चल रहा है?

public class SplashScreen extends Activity { 
    private int _splashTime = 5000; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.splash); 

     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     new Handler().postDelayed(new Thread(){ 
      @Override 
      public void run(){ 
      Intent mainMenu = new Intent(SplashScreen.this, MainMenu.class); 
      SplashScreen.this.startActivity(mainMenu); 
      SplashScreen.this.finish(); 
      overridePendingTransition(R.drawable.fadein, R.drawable.fadeout); 
      } 
     }, _splashTime); 
    } 
} 

मुझे इस कोड का विश्लेषण करने में समस्या है। जहां तक ​​पता है कि हैंडलर मुख्य धागे में चल रहा है। लेकिन इसमें थ्रेड है जो अन्य धागे में चल रहा है।

MainMenu.class मुख्य धागे या दूसरे धागे में चलाया जाएगा? यदि मुख्य धागा 5 सेकंड के लिए बंद कर दिया गया है तो एएनआर उठाया जाएगा। क्यों जब मैं देरी (_splashTime) साथ यह रोक रहा ANR प्रदर्शित नहीं करता है (भले ही मैं इसे अधिक से अधिक 5 सेकंड के लिए वृद्धि)

उत्तर

11

जहां तक ​​पता हैंडलर मुख्य थ्रेड में चल रहा है।

ऑब्जेक्ट थ्रेड पर नहीं चलते हैं, क्योंकि ऑब्जेक्ट्स नहीं चलते हैं। तरीके चलते हैं।

लेकिन इसमें धागा है जो अन्य धागे में चल रहा है।

आपने कोई भी कोड पोस्ट नहीं किया है जिसमें कोई भी "अन्य धागा" शामिल है। उपरोक्त कोड सूची में सब कुछ आपकी प्रक्रिया के मुख्य अनुप्रयोग धागे से जुड़ा हुआ है।

MainMenu.class मुख्य धागे या दूसरे धागे में चलाया जाएगा?

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

क्यों जब मैं देरी से यह रोक रहा (_splashTime) ANR प्रदर्शित नहीं करता है (भले ही मैं इसे अधिक से अधिक 5 सेकंड के लिए वृद्धि)

आप "रोक नहीं कर रहे हैं [मुख्य आवेदन धागा ] विलंब के साथ"। _splashTime मिलीसेकंड के बाद आपने मुख्य एप्लिकेशन थ्रेड पर चलाने के लिए Runnable निर्धारित किया है। हालांकि, postDelayed() अवरुद्ध कॉल नहीं है। यह केवल इवेंट कतार पर एक ईवेंट डालता है जिसे _splashTime मिलीसेकंड के लिए निष्पादित नहीं किया जाएगा।

इसके अलावा, Runnable साथ Thread की जगह कृपया, जब से postDelayed()Thread उपयोग नहीं करता। आपका कोड संकलित और चलाता है, क्योंकि ThreadRunnable लागू करता है, लेकिन आप का उपयोग Runnable के बजाय Thread का उपयोग करते हैं, इसका मतलब है कि आपका कोड पृष्ठभूमि थ्रेड पर चलाएगा, और ऐसा नहीं होगा।

+0

धन्यवाद श्री मर्फी। यह दिखाता है कि मुझे किस हद तक जावा और एंड्रॉइड की अवधारणाएं नहीं मिलीं :) मैंने सोचा कि जब हमारे पास नए हैंडलर() में "नया थ्रेड()" है। पोस्टडेलेड तो नया धागा बनाया जाएगा। – Hesam

+1

@ हेसम: ठीक है, आप 'थ्रेड' ऑब्जेक्ट का उदाहरण बना रहे हैं। हालांकि, एक वास्तविक ओएस * थ्रेड * तब तक नहीं बनाया जाता है जब तक कोई आपके 'थ्रेड' ऑब्जेक्ट पर 'प्रारंभ() 'को कॉल नहीं करता है। चूंकि 'पोस्टडेलेड() 'केवल' रननेबल 'के रूप में ऑब्जेक्ट के बारे में सोच रहा है,' पोस्टडेलेड()' 'start()' को कॉल नहीं करेगा, बस 'रन() '। इसलिए, आपका 'रन() 'कोड मुख्य अनुप्रयोग थ्रेड पर निष्पादित किया जाएगा, पृष्ठभूमि थ्रेड नहीं। – CommonsWare

+0

एक ही जवाब में बहुत उपयोगी जानकारी। –