2016-11-03 77 views
1

嘿,我需要在某個時候刪除這個監聽器,還是它自己被刪除?我在我的活動中調用了一個片段,用戶可以轉到另一個視圖,而不會銷燬這個視圖。因此,不知道我是否設法在onDestroy,呼叫中刪除此項?我沒有看到一個方法來消除它,因爲它是一個DatabaseReferenceFirebase DatabaseReference未刪除事件偵聽器嗎?

下面是代碼:

private DatabaseReference mDatabase; 
    mDatabase.child("projects").orderByChild("viewCount").limitToLast(15).addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

回答

4

火力地堡對象是在你的火力地堡數據庫位置輕量級引用。有沒有必要(也沒有能力)管理他們的生命週期。所以,你可以讓Java垃圾回收器照顧他們。

然而,一旦開始安裝監聽器(例如addValueEventListener()),你應該分開他們在相應的生命週期事件與removeEventListener()。另見Firebase adding listeners in adapters in AndroidHow stop Listening to firebase location in android

+0

因此增加一個ChildEventListener ..那麼是否需要將聽衆刪除?如果是這樣,我怎麼稱呼它是因爲沒有方法od在DatabaseReference上那樣? – Lion789

6

正如超人鏈接顯示的答案:您確實需要刪除相反生命週期事件中的偵聽器。

要刪除監聽器,你需要保持handle that is returned when you call addChildListener()

Query query = mDatabase.child("projects").orderByChild("viewCount").limitToLast(15); 
ChildEventListener listener = query.addChildEventListener(new ChildEventListener() { ... 

然後pass it to removeEventListener()

query.removeChildEventListener(listener); 

你可以看到,我明確地使用Query這裏,因爲這是你實際上將你的聽衆附加到。但是,如果您有一個普通的DatabaseReference,則可以使用相同的方法,因爲DatabaseReference繼承自Query

2

正如Frank所說,您需要從確切確切刪除監聽器,而不是像我在做的那樣只是根DatabaseReference。

爲了簡化這個問題,我創建了下面一個小類:

public class FirebaseListenerRef { 

    private ValueEventListener listener; 
    private DatabaseReference ref; 

    public FirebaseListenerRef(DatabaseReference ref, ValueEventListener listener) { 
     this.listener = listener; 
     this.ref = ref; 

     // Start listening on this ref. 
     ref.addValueEventListener(listener); 
    } 

    public void detach() { 
     ref.removeEventListener(listener); 
    } 
} 

要使用這個,只要創建和成對生命週期事件,例如其取下

private FirebaseListenerRef myFirebaseListenerRef; 

public void onAttach(Content context) { 
    super.onAttach(context); 
    myFirebaseListenerRef = new FirebaseListenerRef(
     FirebaseDatabase.getInstance().getReference().child("path-to-listen-on", 
     new ValueEventListener() { 
      ... implement the listener logic 
     } 
    ); 
} 

public void onDetach() { 
    super.onDetach(); 
    if (myFirebaseListenerRef != null) { 
    // Detach our listener from its reference 
     myFirebaseListenerRef.detach(); 
     myFirebaseListenerRef == null; 
    } 
} 
0

如果使用Query添加addValueEventListener。那麼你應該刪除使用Query實例而不是DatabaseReference實例的偵聽器。

DatabaseReference開發商用orderByChild這是Query類型,以便去除我們需要得到參考查詢實例,然後使用removeEventListener的聽衆問題。

這是我消除聽者的例子:

ValueEventListener carChangesListener; 
Query ownerId_Query; 

然後

DatabaseReference bikeRef = FirebaseDatabase.getInstance().getReference().child("Cars"); 
     ownerId_Query = bikeRef.orderByChild("ownerId").equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid()); 
     carChangesListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot.getValue() != null) { 
        /*NOTE: handle cars response here*/ 
       }else{ 
        Toast.makeText(getActivity(), "No car found for this user.", 
          Toast.LENGTH_LONG).show(); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.w(HOME_TAG, "Failed to read value.", databaseError.toException()); 
       Toast.makeText(getActivity(), "Error!" + databaseError.toException().getMessage(), 
         Toast.LENGTH_LONG).show(); 
      } 
     }; 
     ownerId_Query.addValueEventListener(bikeChangesListener); 

我們刪除carChangesListener我會做如下:

ownerId_Query.removeEventListener(carChangesListener);