2012-01-06 30 views
5

मैं अभी ब्लूटूथ एंड्रॉइड एपीआई का अध्ययन कर रहा हूं, और मैं ब्लूटूथ उदाहरण में भाग गया। http://developer.android.com/resources/samples/BluetoothChat/index.htmlBluetoothChatResume गतिविधि जीवन चक्र विधि पर सिंक्रनाइज़ किया गया, क्यों?

इसमें कई त्रुटियां हैं, यह सबसे सरल तथ्य है कि यह एपीआई 11 का उपयोग करता है लेकिन मैनिफेस्ट इस न्यूनतम एपीआई को मजबूर नहीं करता है।

अन्य दिलचस्प बात यह है onResume पर की तरह, गतिविधि जीवन चक्र तरीकों पर सिंक्रनाइज़ कीवर्ड का प्रयोग होता है:

@Override 
public synchronized void onResume() { 
    super.onResume(); 
    if(D) Log.e(TAG, "+ ON RESUME +"); 

    // Performing this check in onResume() covers the case in which BT was 
    // not enabled during onStart(), so we were paused to enable it... 
    // onResume() will be called when ACTION_REQUEST_ENABLE activity returns. 
    if (mChatService != null) { 
     // Only if the state is STATE_NONE, do we know that we haven't started already 
     if (mChatService.getState() == BluetoothChatService.STATE_NONE) { 
      // Start the Bluetooth chat services 
      mChatService.start(); 
     } 
    } 
} 

क्यों इस कीवर्ड वहाँ प्रयोग किया जाता है? क्या कोई उचित स्पष्टीकरण है, या बस कोड लिखने वाले व्यक्ति को यह नहीं पता था कि रेस्यूम हमेशा एक ही धागे से बुलाया जाएगा? या मुझे कुछ याद आती है?

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

+0

मैं वास्तव में इस प्रश्न का उत्तर भी जानना चाहता हूं ... –

उत्तर

1

यह एक बहुत पुराना सवाल प्रतीत हो रहा है, लेकिन यहाँ पर क्या मुझे लगता है कि हो रहा है है:

मेरा अनुमान है कि इसके बारे में जब "संवादों" वापसी सावधान रहना चाहती है। ब्लूटूथकैट उदाहरण ब्लूटूथ को सक्षम करने, खोज को सक्षम करने और युग्मन/कनेक्शन शुरू करने के लिए संवाद (साथ ही एक ओवरले संवाद-जैसी गतिविधि) का उपयोग करता है।

मुझे यह सुनिश्चित करने के लिए नहीं पता है, लेकिन मुझे संदेह है कि वहां एक बग था जहां विभिन्न धागे मुख्य गतिविधि में लौट रहे थे और onResume को कैसे संभालना है, इस बारे में भ्रम पैदा हुआ।

उन्हें शायद क्या करना चाहिए synchronize किसी ऑब्जेक्ट पर एक ब्लॉक और राज्य का निर्धारण करने के लिए इस्तेमाल किए गए झंडे हैं। इस तरह इरादे, राज्य और कार्यक्षमता अधिक स्पष्ट हैं - और ऐप जानता है कि onResume में इसे क्या करना चाहिए;

कुछ इस तरह हो सकता है:

//class fields  
private Object myLockObj = new Object(); 
private boolean isPausedForPairing = false; 

public void onResume() 
{ 
    super.onResume(); 

    synchronized (myLockObj) 
    { 
     if (isPausedForPairing) 
     { 
      //handle a "pairing" onResume 
     } 
    } 
} 

हालांकि, यह एक उदाहरण एप्लिकेशन न होने के कारण वे और अधिक सरल कुछ के साथ जाने का फैसला किया हो सकता है। उदाहरण ऐप्स हमेशा सम्मेलन का पालन नहीं करते हैं क्योंकि विचार उदाहरण के लिए आवश्यक विशेष कोड प्रदर्शित करना है। कभी-कभी सम्मेलन के बाद बहुत सारे "विचलित" कोड जोड़ सकते हैं। चाहे आप इससे सहमत हों या नहीं, हालांकि आप पर निर्भर है।