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(){