मैं अपने ऐप के लिए एक साधारण दराज बनाने के लिए 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()
में कॉल किया जाता है।
श्रोता से डेटा को पर्यवेक्षक के साथ कैसे पुनर्प्राप्त किया जाए, तो मैं इसे कहीं और उपयोग कर सकता हूं?
'notifyObservers (स्ट्रिंग)' 'changeMe से बुलाया जाना चाहिए()'। – cybergen
@cybergen, "होना चाहिए" शायद मेरे लिए थोड़ा सा प्रतिबंधक है। यह सार्वजनिक है इसलिए यह जानबूझकर खुलासा किया गया है। मैं सामान्य मामले में 'अधिसूचना ऑब्सर्वर' को कॉल करने वाली हर विधि में कहूंगा जो राज्य को अत्यधिक कर सकता है। हालांकि मैं आपका मुद्दा देखता हूं। ओपी के मामले में इससे कोई फर्क नहीं पड़ता क्योंकि केवल एक ही अधिसूचना है। मैं इसे देखने के लिए इसे संपादित कर दूंगा और इसलिए यह ओपी के कोड से बेहतर मेल खाता है। – ChiefTwoPencils
ओह वाह, बहुत बहुत धन्यवाद, इसलिए मैं 'changeMe' विधि को उस स्ट्रिंग को वापस कर सकता हूं जिसे बदले जा रहा है और पर्यवेक्षकों को अवलोकन योग्य हाँ के अंदर जोड़ा जाना नहीं है? –