2016-01-29 17 views
5

Uygulamam için basit bir çekmece oluşturmak için MaterialDrawer kitaplığını kullanıyorum, kitaplıktaki sınıfların bazı örneklerinin çağrıldığında onlara iletilen bir dizeye ihtiyacı var.Bir dinleyiciden veri almak için nasıl bir gözlemci uygularım?

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

withName() yöntem bir dize alır: Bir örnek IProfile sınıftır.

MaterialDrawer kitaplığına sahip olan MainActivity adresinde kullanılmak üzere veri almak için kullanmayı amaçladığım bir sınıf MyObservable.java (Gözlemlenebilir genişler) sınıfı oluşturdum. Bu sınıfta, firebase veritabanımdan ihtiyacım olan şey için dinleyicimi içeren bir implementData() yöntemim var.

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); 
    } 
} 

Sonra changeUsername() yöntemi ile kullanıcı adı değişikliği benim gözlemci bildirmek:

Bu

gibi görünüyor ne MyObservable sınıfta

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

     setChanged(); 
     notifyObservers(username); 
    } 

, bir MyObserver sınıfı var Bir gözlemci güncellendiğinde, update() yöntemi ile Observer uygular. Şu an için update() yönteminde, bir şeylerin gerçekte olduğundan emin olmak için kullanıcının username numarasını yazdım.

I (MainActivity olarak) gözlemciden veri gerek burasıdır:

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); 
    } 

    ... 

} 

ben veri almak için deneyerek dinleyici oluyor olaylara ' tepki' çalışırken saat geçirdim Benim AnaAktivitemde kullanacağım ama Gözlemlenebilir/Gözlemci modelini düzgün bir şekilde kullandığımdan emin değilim, bu da Firebase'in veri almak için bir Eşzamansız olayı olduğundan, bir Gözlemci kullanmak bunu yapmanın en iyi yolu olmuştur.

Etkinliğim onCreate() içinde appDrawer() yöntemi çağrılır.

Dinleyiciden Verileri bir Gözlemci ile nasıl alırım, başka bir yerde kullanabilir miyim?

cevap

13

Tasarımlarınızdan neler olduğunu anlatamam. Bir Listener sınıfının isimlendirilmesi daha sonra Observable'un karşı-sezgisel görünmesini sağlar. Bir dinleyici dinler veya gözlemler. Yine de, bir Observer olan Listener'da başka bir sınıfınız olduğu anlaşılıyor, bu yüzden biraz kayboldum ancak deseni doğru uygulamışsanız emin değilsiniz. Bir örnekle anlayabileceğim.

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 yöntem size gözlemliyoruz nesneyi yanı sıra argümanlar (eğer gözlemci paylaşılır istediğiniz verileri) Eğer notifyObservers() geçti verir. Eğer bunu böyle yaparsan, beklediğiniz davranışa sahip olmalısın.

Gördüğünüz gibi gözlemlenenlerin dışında veya içinde bulunan gözlemcilere veri gönderilebilir. Onu çalıştırdığınızda çıktı ...

Merhaba gözlemlenebilir

+0

'notifyObservers (String) 'changeme' dan() 'aranmalıdır. – cybergen

+1

@cybergen, "olmalı" muhtemelen benim için biraz kısıtlayıcıdır. Kamusaldır, bu yüzden kasıtlı olarak açığa çıkar. Genel durumunda, durumu değiştiren her türlü yöntemde "notifyObservers" ifadesini çağırmak diyebilirim. Senin noktanı görüyorum. OP'nin durumunda, sadece bir tane bildirdiği kadar önemli değil. İzleme keyfiniz için düzenleyeceğim ve böylece OP'nin kodunu daha iyi eşleştireceğim. – ChiefTwoPencils

+0

Oh wow, çok teşekkür ederim, bu yüzden 'changeMe' yönteminin yerine güncellenmekte olan dizgiyi döndürmesini sağlayabilirim ve gözlemcilerin gözlemlenebilir olanın içine eklenmesi gerekmez. –

İlgili konular