Android 使onDataChange仅在应用程序处于前台(打开且可见)时工作?
如何使Android 使onDataChange仅在应用程序处于前台(打开且可见)时工作?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,如何使onDataChange(DataSnapshot DataSnapshot)仅在我的应用程序位于前台时才起作用?当我的应用程序在后台时,我不希望它检测到任何更改 final FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("server/saving-data/fireblog/posts"); ref.addValueEv
onDataChange(DataSnapshot DataSnapshot)
仅在我的应用程序位于前台时才起作用?当我的应用程序在后台时,我不希望它检测到任何更改
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("server/saving-data/fireblog/posts");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) { //only when app is in the foreground!
System.out.println("change");
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
要使其在可见时工作,请执行以下操作: 在你的简历中:-
@Override
public void onResume() {
super.onResume();
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("change");
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
}
在“打开销毁”中,将其设置为空:
@Override
public void onDestroy() {
super.onDestroy();
ref.addValueEventListener(null);
}
要使其在可见时工作,请执行以下操作: 在你的简历中:-
@Override
public void onResume() {
super.onResume();
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("change");
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
}
在“打开销毁”中,将其设置为空:
@Override
public void onDestroy() {
super.onDestroy();
ref.addValueEventListener(null);
}
要实现这一点,您需要根据活动生命周期删除侦听器,如下所示:
databaseReference.removeEventListener(valueEventListener);
public class MainActivity extends AppCompatActivity {
DatabaseReference ref;
ValueEventListener valueEventListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ref = FirebaseDatabase.getInstance().getReference().child("myproj").child("data");
valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//get data
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
ref.addListenerForSingleValueEvent(valueEventListener);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(valueEventListener != null) {
databaseReference.removeEventListener(valueEventListener);
}
}
}
如果已在onCreate
中添加了侦听器,则必须在onDestroy
中将其删除。如果在onStart
中添加了侦听器,则必须在onStop
中删除它。如果在onResume
中添加了侦听器,则必须在onPause
中将其删除
您的类应该如下所示:
databaseReference.removeEventListener(valueEventListener);
public class MainActivity extends AppCompatActivity {
DatabaseReference ref;
ValueEventListener valueEventListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ref = FirebaseDatabase.getInstance().getReference().child("myproj").child("data");
valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//get data
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
ref.addListenerForSingleValueEvent(valueEventListener);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(valueEventListener != null) {
databaseReference.removeEventListener(valueEventListener);
}
}
}
希望有帮助。要实现这一点,您需要根据活动生命周期删除侦听器,如下所示:
databaseReference.removeEventListener(valueEventListener);
public class MainActivity extends AppCompatActivity {
DatabaseReference ref;
ValueEventListener valueEventListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ref = FirebaseDatabase.getInstance().getReference().child("myproj").child("data");
valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//get data
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
ref.addListenerForSingleValueEvent(valueEventListener);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(valueEventListener != null) {
databaseReference.removeEventListener(valueEventListener);
}
}
}
如果已在onCreate
中添加了侦听器,则必须在onDestroy
中将其删除。如果在onStart
中添加了侦听器,则必须在onStop
中删除它。如果在onResume
中添加了侦听器,则必须在onPause
中将其删除
您的类应该如下所示:
databaseReference.removeEventListener(valueEventListener);
public class MainActivity extends AppCompatActivity {
DatabaseReference ref;
ValueEventListener valueEventListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ref = FirebaseDatabase.getInstance().getReference().child("myproj").child("data");
valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//get data
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
ref.addListenerForSingleValueEvent(valueEventListener);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(valueEventListener != null) {
databaseReference.removeEventListener(valueEventListener);
}
}
}
希望能有所帮助。Alex和Saurabh的回答说明了如何在应用程序处于后台时删除侦听器
另一种方法是显式地告诉Firebase停止同步。在活动调用的
onPause
中。然后在onResume
方法调用中。Alex和Saurabh的回答显示了如何在应用程序处于后台时删除侦听器
另一种方法是显式地告诉Firebase停止同步。在活动调用的
onPause
中。然后在onResume
方法调用中。有没有更有效的方法?@Saurabh:您可能想在onDestroy()
中实际删除侦听器。有没有更有效的方法?@Saurabh:您可能想在onDestroy()
中实际删除侦听器。为什么以下方法不起作用<代码>FirebaseDatabase.getInstance().getReferenceFromUrl(“https://myproj-21a87.fireb作为eio.com/data“.g奥纳尔ine()代码>感谢您的高效回答!因为您需要在FirebaseDatabase
对象上调用goOnline()
和goOffline()
:FirebaseDatabase.getInstance().goOnline()
。但如何才能在数据库的特定部分“脱机”?这就是我想做的。你的问题是当应用程序在后台时,不要检测到任何变化。调用goOffline()
是实现这一点的一种方法。如果您只希望某些位置停止接收更新,则必须从这些位置删除侦听器,正如Alex和Saurabh所示/所说的那样。为什么以下操作不起作用<代码>FirebaseDatabase.getInstance().getReferenceFromUrl(“https://myproj-21a87.fireb作为eio.com/data“.g奥纳尔ine()代码>感谢您的高效回答!因为您需要在FirebaseDatabase
对象上调用goOnline()
和goOffline()
:FirebaseDatabase.getInstance().goOnline()
。但如何才能在数据库的特定部分“脱机”?这就是我想做的。你的问题是当应用程序在后台时,不要检测到任何变化。调用goOffline()
是实现这一点的一种方法。如果您只希望某些位置停止接收更新,则必须从这些位置删除侦听器,如Alex和Saurabh所示/所说。感谢您的回答。我添加了数据库引用。removeEventListener(valueEventListener)代码>但Android Studio以红色突出显示数据库引用,因为它找不到。我在onCreate
中声明了databaseReference
,它以红色突出显示,因为databaseReference
对象的名称是other。我写了一个例子,如果您使用这行代码:DatabaseReference-DatabaseReference=FirebaseDatabase.getInstance().getReference()
如果变量的名称是ref
或yourRef
或任何其他名称,只需使用它来代替databaseReference
。您能给出一个实际实现的简单示例吗?这是我的真实代码`final DatabaseReference ref=FirebaseDatabase.getInstance().getReferenceFromUrl(“);ref.addValueEventListener(新ValueEventListener(){感谢您的精彩回答。我添加了DatabaseReference.removeEventListener(ValueEventListener);
但是Android Studio以红色突出显示databaseReference
,因为它找不到它。我在onCreate
中声明了databaseReference
,它以红色突出显示,因为您的databaseReference
对象的名称是other。如果您使用这行代码,我写了一个示例:databaseReference databaseReference=FirebaseDatabase.getInstance().getReference()
如果变量的名称是ref
或yourRef
或任何其他名称,只需使用它来代替databaseReference
。您能给出一个实际实现的简单示例吗?upvoted这是我的真实代码;`final databaseref=FirebaseDatabase.getInstance().getReferenceFromUrl();ref.addValueEventListener(新的ValueEventListener(){