2016-11-03 49 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);