2016-01-29 4 views
5

मैं अपने ऐप के लिए एक साधारण दराज बनाने के लिए MaterialDrawer लाइब्रेरी का उपयोग कर रहा हूं, लाइब्रेरी में कक्षाओं के कुछ उदाहरणों को कॉल करते समय एक स्ट्रिंग की आवश्यकता होती है।श्रोता से डेटा प्राप्त करने के लिए मैं पर्यवेक्षक को कैसे कार्यान्वित करूं?

IProfile profile = new ProfileDrawerItem().withName("John Doe");

जहां withName() विधि एक स्ट्रिंग में लेता है: एक उदाहरण IProfile वर्ग है।

मैंने कक्षा MyObservable.java (पर्यवेक्षण योग्य विस्तारित) कक्षा बनाई है जिसका उपयोग मैं अपने MainActivity में डेटा का उपयोग करने के लिए कर रहा हूं जिसमें सामग्री ड्रावर लाइब्रेरी लागू है। इस कक्षा में, मेरे पास एक विधि implementData() है जिसमें मेरे फ़ायरबेस डेटाबेस से मुझे जो चाहिए, उसके लिए मेरा श्रोता है।

public class MyObservable extends Observable { 

    // Attach our firebase reference... 
    Firebase userRef = new Firebase("https://myApp.firebaseio.com/users"); 
    AuthData authData; 

    public String username = ""; 
    public String email = ""; 


    public void changeUsername(String username) { 
     this.username = username; 

     setChanged(); 
     notifyObservers(username); 
    } 


    public void implementData(){ 
     // Get the authentication data of our user from the reference. 
     authData = userRef.getAuth(); 

     // This is the listener I have to get the data from. 
     userRef.child(authData.getUid()).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot snapshot) { 

       UserSchema user = snapshot.getValue(UserSchema.class); 
       // This guy needs to be used in the MainActivity appDrawer() method 
       String userName = user.getName(); 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     }); 

    } 
} 

class MyObserver implements Observer { 

    public void update(Observable observable, Object data) { 
     // For now I just print it out to System.out 
     System.out.println("Username:" + data); 
    } 
} 

तब मैं changeUsername() विधि के साथ उपयोगकर्ता नाम परिवर्तन की मेरी पर्यवेक्षकों को सूचित:

यह कैसा दिखता है

public void changeUsername(String username) { 
     this.username = username; 

     setChanged(); 
     notifyObservers(username); 
    } 

MyObservable कक्षा में, मैं एक MyObserver वर्ग है लागू करता है update() विधि जब भी एक पर्यवेक्षक अद्यतन किया गया है। update() विधि में, अब उपयोगकर्ता को यह सुनिश्चित करने के लिए कि उपयोगकर्ता वास्तव में कुछ हो रहा है, username प्रिंट करें।

यह वह जगह है जहाँ मैं पर्यवेक्षक से डेटा की जरूरत है (MainActivity में):

public class MainActivity extends AppCompatActivity { 
    ... 

    public void appDrawer(){ 

     IProfile profile = new ProfileDrawerItem() 

       // I need the user's data here 
       .withName("Test") 
       .withEmail("[email protected]") 
       .withIcon(R.drawable.avatar2); 
    } 

    ... 

} 

मैं घंटे खर्च करने का 'प्रतिक्रिया' घटनाओं श्रोता में क्या हो रहा करने के लिए डेटा पुनः प्राप्त करने की कोशिश कर रहा द्वारा की कोशिश कर रहा मेरे मुख्य क्रियाकलाप में उपयोग करने के लिए, लेकिन मुझे यकीन नहीं है कि मैं अवलोकन/पर्यवेक्षक पैटर्न का सही ढंग से उपयोग कर रहा हूं, क्योंकि यह डेटा प्राप्त करने के लिए फायरबेस द्वारा एक असीमित घटना है, एक पर्यवेक्षक का उपयोग करके ऐसा करने का सबसे अच्छा तरीका रहा है।

appDrawer() विधि को मेरी गतिविधि के onCreate() में कॉल किया जाता है।

श्रोता से डेटा को पर्यवेक्षक के साथ कैसे पुनर्प्राप्त किया जाए, तो मैं इसे कहीं और उपयोग कर सकता हूं?

उत्तर

13

मैं आपके डिजाइन द्वारा बता नहीं सकता कि वास्तव में क्या चल रहा है। कक्षा Listener नामकरण करने के बाद इसे Observable काउंटर-अंतर्ज्ञानी लगता है। एक श्रोता सुनता है या देखता है। फिर भी, ऐसा लगता है कि आपके पास Listener में एक और वर्ग है जो Observer है इसलिए मैं थोड़ा खो गया हूं लेकिन यदि आप पैटर्न को सही तरीके से कार्यान्वित करते हैं तो आपको अनिश्चित लगता है। कि मैं एक उदाहरण के साथ साफ़ कर सकते हैं।

public class MyObserver implements Observer { 
    @Override 
    public void update(Observable o, Object arg) { 
     System.out.println(arg + " " + ((MyObservable)o).name); 
    } 
} 

public class MyObservable extends Observable { 

    public String name = "Observable"; 

    public void changeMe(String word) { 
     setChanged(); 
     notifyObservers(word); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     MyObservable myObservable = new MyObservable(); 
     myObservable.addObserver(new MyObserver()); 
     myObservable.changeMe("Hello"); 
    } 
} 

update विधि आप वस्तु आप देख रहे हैं और साथ ही तर्क (डेटा आप पर्यवेक्षक साथ साझा करना चाहते) आप notifyObservers() में पारित कर देता है। यदि आपने ऐसा किया है तो आपको वह व्यवहार प्राप्त करना चाहिए जो आप चाहते हैं।

जैसा कि आप देख सकते हैं कि डेटा पर्यवेक्षकों को भेजा जा सकता है जो देखने योग्य या बाहर के अंदर हैं। जब आप इसे चलाते हैं तो आउटपुट होता है ...

हैलो नमूदार

+0

'notifyObservers (स्ट्रिंग)' 'changeMe से बुलाया जाना चाहिए()'। – cybergen

+1

@cybergen, "होना चाहिए" शायद मेरे लिए थोड़ा सा प्रतिबंधक है। यह सार्वजनिक है इसलिए यह जानबूझकर खुलासा किया गया है। मैं सामान्य मामले में 'अधिसूचना ऑब्सर्वर' को कॉल करने वाली हर विधि में कहूंगा जो राज्य को अत्यधिक कर सकता है। हालांकि मैं आपका मुद्दा देखता हूं। ओपी के मामले में इससे कोई फर्क नहीं पड़ता क्योंकि केवल एक ही अधिसूचना है। मैं इसे देखने के लिए इसे संपादित कर दूंगा और इसलिए यह ओपी के कोड से बेहतर मेल खाता है। – ChiefTwoPencils

+0

ओह वाह, बहुत बहुत धन्यवाद, इसलिए मैं 'changeMe' विधि को उस स्ट्रिंग को वापस कर सकता हूं जिसे बदले जा रहा है और पर्यवेक्षकों को अवलोकन योग्य हाँ के अंदर जोड़ा जाना नहीं है? –

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

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