2015-01-15 7 views
8

एंड्रॉइड पर चलने पर सवाल, प्रोग्राम ब्लूटूथ ब्लूटूथ (बीटी) डिवाइस को नियंत्रित करता है। इसमें कुछ बटन हैं जो सहकर्मी उपकरणों के विभिन्न कार्यों को सक्षम करते हैं।प्रारंभिक उपस्थिति में एंड्रॉइड प्रोग्राम फ्लो कंट्रोल एक्टिविटीफॉर रीसेट कॉल

एंड्रॉइड डिवाइस पर डिफ़ॉल्ट रूप से ब्लूटूथ सक्षम नहीं है, और कनेक्शन बटन (बटन) क्लिक के बाद छोटी अवधि के लिए स्थापित किया गया है।

तो, प्रत्येक बटन क्लिक करने के बाद प्रवाह है:

  1. (आशय सक्षम बीटी के साथ startActivityForResult() नहीं करता है, तो) यह सुनिश्चित बीटी सक्षम
  2. रिमोट डिवाइस
  3. से कनेक्ट रिमोट डिवाइस के कुछ समारोह सक्षम डिवाइस से
  4. डिस्कनेक्ट

मेरे मुद्दा यह है कि अगर बीटी सक्षम नहीं है, तो एक सीए प्रोग्राम प्रवाह के # 1 "ब्रेक" में startActivityForResult() पर होगा। बाद में, जब onActivityResult() कहा जाता है, तो मैं उस बिंदु से प्रवाह फिर से शुरू करना चाहता हूं जहां यह "टूट गया" था।

उस उद्देश्य के लिए मैं अतिरिक्त सदस्य क्षेत्र और कुछ स्थिरांक परिभाषित करने और उन्हें onActivityResult() में इस्तेमाल किया:

private int mRerunMethodIndex = 0; 
private static final int RERUN_METHOD1 = 1; 
private static final inr RERUN_METHOD2 = 2; 
... 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case REQUEST_ENABLE_BT: 
      if (resultCode == Activity.RESULT_OK) { 
       int rerunMethodIndex = mRerunMethodIndex; 
       mRerunMethodIndex = 0; 
       switch (rerunMethodIndex) { 
        case (RERUN_METHOD1): 
         method1(); 
         break; 
        case (RERUN_METHOD2): 
         method2(); 
         break; 
        // ... the same for other cases 
       } 
      } 
      break;  
     default: 
      break; 
    } 
} 

अब, एक और जटिलता: onActivityResult() गतिविधि के onResume() से पहले बुलाया जाएगा। इससे कोई फर्क नहीं पड़ता कि methodX() में से कोई भी दृश्य पदानुक्रम को बदलने की आवश्यकता है। मेरे मामले में ये विधियां कुछ टुकड़ों को प्रतिस्थापित करती हैं, और यदि यह ऑपरेशन onActivityResult() से निष्पादित किया गया है तो अपवाद फेंक दिया जाता है।

इस अतिरिक्त समस्या को हल करने के लिए, onActivityResult() से बदसूरत switchonPostResume() पर माइग्रेट करता है।

दृष्टिकोण काम करता है ऊपर वर्णित है, लेकिन यह कोड के ugliest टुकड़े मैंने कभी लिखा है में से एक है: methodX() "रजिस्टर" ही "फिर से दौड़ना के लिए" के बाद RERUN_METHOD_X निरंतर mRerunMethodIndex को, onActivityResults() सेट कुछ "फिर से दौड़ना झंडा" बताए द्वारा बीटी सक्षम है, onPostResume() ध्वज की जांच करता है, इस ध्वज को साफ़ करता है, mRerunMethodIndex साफ़ करता है और उचित methodX() को पुन: चालू करता है।

क्या कोई और सुरुचिपूर्ण दृष्टिकोण है (अधिमानतः 1 या 2 विधियों तक ही सीमित है)?

उत्तर

3

आप चरणबद्ध स्थिरांक का उपयोग किये बिना अपने वर्कफ़्लो को व्यवस्थित करने के लिए रननेबल का उपयोग कर सकते हैं। उदाहरण के लिए:

public void Runnable mMethod1 = new Runnable() { 
    public void run() { 
     // your code for method 1 
    } 
} 

public void Runnable mMethod2 = new Runnable() { 
    public void run() { 
     // your code for method 2 
    } 
} 

public void Runnable mMethod3 = new Runnable() { 
    public void run() { 
     // your code for method 3 
    } 
} 

private void startMethod(Runnable method) { 
    mCurrentMethod = method; 
    method.run(); 
} 

... 

public vond onPostResume() { 
    if (mCurrentMethod != null) { 
     mCurrentMethod.run(); 
     mCurrentMethod = null; 
    } 
} 
+0

कमांड डिज़ाइन पैटर्न की कुछ भिन्नता की तरह दिखता है। मुझे पूरी तरह से यकीन नहीं है कि यह दृष्टिकोण कोड को सरल बना देगा, लेकिन यह वास्तव में एक दिलचस्प है। मैं यह देखने की कोशिश करूंगा कि अगली बार जब मैं इस स्थिति में आया तो यह कैसे काम करता है। – Vasiliy

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