2014-07-24 14 views
7

मेरे पास बहुत बुनियादी ques हैं। और यह बहुत आसान हो सकता है लेकिन मुझे यह नहीं मिल रहा है। मेरे पास एक गतिविधि है जहां मैं कुछ यूआई घटक का उपयोग कर रहा हूं। और मेरे पास प्रसारण रिसीवर (मैनिफेस्ट से पंजीकरण) है जहां मुझे गतिविधि वर्ग के कुछ UI घटक को अपडेट करने की आवश्यकता है। की तरह -ब्रॉडकास्ट रिसीवर से गतिविधि UI घटक अपडेट कर रहा है?

Class MyActivity extends Activity 
    { 

     onCreate(){ 

     //using some UI component lets say textview 
      textView.setText("Some Text"); 
     } 

     updateLayout() 
     { 
     textView.setText("TextView Upadated..."); 
     } 
} 


Class broadCastReceiver 
{ 

    onReceive() 
    { 
     //here I want to update My Activity component like 
     UpdateLayout(); 

    } 

} 

कि, एक समाधान के लिए कि updateLayout() विधि सार्वजनिक स्थिर बनाने, और गतिविधि संदर्भ द्वारा रिसीवर कक्षा में है कि विधि का उपयोग है। लेकिन मुझे लगता है, यह करने का सही तरीका नहीं है .. क्या ऐसा करने का कोई उचित तरीका है? प्रकट में एक रिसीवर के पंजीकरण की

+1

आप अपनी गतिविधि के अंदर प्रसारण रिसीवर उपवर्ग सकते हैं, या, प्रतिनिधिमंडल पैटर्न – Blackbelt

+0

का उपयोग करते हैं मैं रिसीवर वर्ग उपवर्ग तो मैं इसे स्थिर वर्ग बनाने के लिए है और फिर से मैं बनाने के लिए स्थिर के रूप में विधि .. –

+0

आपको इसे स्थिर क्यों बनाना है? – Blackbelt

उत्तर

4

फायरिंग के लिए पर्यवेक्षक को जोड़ने के लिए क्या तुम सच में का उपयोग कर रखने के लिए है, तो का उपयोग BroadcastReceiverAndroidManifest.xml से पंजीकृत है तो आप ईवेंट बस का उपयोग करने पर विचार कर सकते हैं। स्क्वायर से एक अच्छी ओपन सोर्स लाइब्रेरी Otto है।

यह प्रकाशक/ग्राहक पैटर्न को बहुत अच्छी तरह कार्यान्वित कर रहा है। आपको वेब पर कई उदाहरण मिलेंगे, इसका उपयोग कैसे करें, यह बहुत आसान है।सबसे पहले ओटो के website

यदि आप सीधे Activity से रिसीवर पंजीकृत/पंजीकरण नहीं कर सकते हैं तो मैं @Ritesh Gune उत्तर का पालन करूंगा।

6

इसके बजाय, आप रजिस्टर और रनटाइम पर यह अपंजीकृत इस प्रकार कर सकते हैं:

यह भी सुनिश्चित करें कि आप आशय फ़िल्टर में सही कार्रवाई के साथ अपने रिसीवर रजिस्टर कर सकते हैं।

public class MyActivity extends Activity{ 

// used to listen for intents which are sent after a task was 
// successfully processed 
private BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     new UpdateUiTask().execute(); 
    } 
}; 

@Override 
public void onResume() {   
    registerReceiver(mUpdateReceiver, new IntentFilter(
      YOUR_INTENT_ACTION)); 
    super.onResume(); 
} 

@Override 
public void onPause() {  
    unregisterReceiver(mUpdateReceiver); 
    super.onPause(); 
} 


// used to update the UI 
private class UpdateUiTask extends AsyncTask<Void, Void, String> { 

    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected String doInBackground(Void... voids) { 
     Context context = getApplicationContext(); 
     String result = "test"; 
     // Put the data obtained after background task. 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO: UI update   
    } 
} 

} 

आशा है कि यह मदद करता है।

+0

async कार्य का उद्देश्य क्या है? – Blackbelt

+0

Async कार्य केवल तभी प्रदान किया जाता है जब नेटवर्क कॉल को परिणामस्वरूप() में परिणाम के आधार पर बनाया जाना चाहिए। उस स्थिति में कोई ऐसा कर सकता है जो DoInBackground() में कर सकता है। अन्यथा पोस्टएक्सक्यूट() में यूआई को बस अपडेट कर सकते हैं। @blackbelt, मैं निश्चित रूप से सीखना चाहूंगा कि यहां कुछ बेहतर किया जा सकता है या नहीं। Thnx। –

2
docs से

:

आप या तो गतिशील Context.registerReceiver() या स्थिर के साथ इस वर्ग का एक उदाहरण रजिस्टर कर सकते हैं अपने AndroidManifest.xml में टैग के माध्यम से एक कार्यान्वयन प्रकाशित करते हैं।

Activity.onResume() में एक रिसीवर पंजीकृत करें Activity.onPause() में कार्यान्वयन और पंजीकरण रद्द करें।

public class MyActivity extends Activity 
{ 
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      MyActivity.this.broadcastReceived(intent); 
     } 
    }; 

    public void onResume() { 
     super.onResume(); 
     IntentFilter intentFilter = new IntentFilter(); 
     // add action, category, data to intentFilter 
     this.registerReceiver(this.mBroadcastReceiver, intentFilter); 
    } 

    public void onPause() { 
     super.onPause(); 
     this.unregisterReceiver(this.mBroadcastReceiver); 
    } 

    public void broadcastReceived(Intent intent) { 
     // Update the UI component here. 
    } 
} 
0

आप प्रसारण रिसीवर के साथ पर्यवेक्षक पैटर्न गतिविधि onResume में खुद को पंजीकृत करता है() का उपयोग अद्यतन और onPause में() ही unregisters प्राप्त करने के लिए कर सकते हैं।

नेट पर सामग्री के बहुत pattern- http://en.wikipedia.org/wiki/Observer_pattern

3

पर्यवेक्षक जानने के लिए आप के साथ ObservableEvent उपयोग कर सकते हैं प्रत्यक्ष वर्ग फैली हैं।

public class ObservableEvent extends Observable { 
public void setChanged(){ 
    super.setChanged(); 
} 
} 

मेक सिंगलटन वर्ग अधिसूचना केंद्र

public class NSNotificationCenter { 

private HashMap<String, ObservableEvent> observables = new HashMap<String, ObservableEvent>(); 

/** 
* Lazy load the event bus 
*/ 

public void addObserver(String notification, Observer observer) { 
    ObservableEvent observable = observables.get(notification); 
    if (observable == null) { 
     observable = new ObservableEvent(); 
     observables.put(notification, observable); 
    } 
    observable.addObserver(observer); 
} 

public void removeObserver(String notification, Observer observer) { 
    Observable observable = observables.get(notification); 
    if (observable != null) { 
     observable.deleteObserver(observer); 
    } 
} 


public void postNotification(String notification, Object object) { 
     ObservableEvent observable = observables.get(notification); 
     if (observable != null) { 
      observable.setChanged(); 
      if (object == null) { 
       observable.notifyObservers(); 
      } else { 
       observable.notifyObservers(object); 
      } 
     } 
} 

}

सिर्फ सूचित के अवलोकन के लिए और विधि उपयोग पोस्ट सूचना

4

मैं निश्चित रूप से GreenRobot से EventBus की सलाह देते हैं

EventBus एक Android अनुकूलित प्रकाशित/घटना बस सदस्यता ले रहा है। एंड्रॉइड ऐप्स के लिए एक सामान्य उपयोग केस एक साथ क्रियाकलाप, टुकड़े, और पृष्ठभूमि धागे gluing है। उन तत्वों के पारंपरिक तारों में अक्सर जटिल और त्रुटि-प्रवण निर्भरताओं और जीवन चक्र के मुद्दों को प्रस्तुत किया जाता है। EventBus सभी प्रतिभागियों के माध्यम से श्रोताओं का प्रचार (उदाहरण के लिए पृष्ठभूमि सेवा -> गतिविधि -> एकाधिक टुकड़े या सहायक वर्ग) बहिष्कृत हो जाता है। इवेंटबस घटना प्रेषक और रिसीवर decouples और इस प्रकार ऐप घटकों के बीच संचार को सरल बनाता है। कम कोड, बेहतर गुणवत्ता। और आपको एक इंटरफ़ेस को लागू करने की आवश्यकता नहीं है!

जांच: https://github.com/greenrobot/EventBus

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