android - Firebase 数据库在值更改时重新打开活动
问题描述
当我更改数据库中的值时,我的活动出现问题。我尝试使用工具栏创建一个新活动,工具栏的标题通过数据库值更改ValueEventListener
。问题是,当我更改数据库中的值时,活动会自行重新打开。
private static String eventKey;
private FirebaseAuth mAuth;
private DatabaseReference mDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testing);
mAuth = FirebaseAuth.getInstance();
if (mAuth.getCurrentUser() == null) {
finishAffinity();
startActivity(new Intent(this, HomeScreenActivity.class));
}
eventKey = getIntent().getExtras().getString("eventKey");
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mDatabase = FirebaseDatabase.getInstance().getReference().child("Eventos").child(eventKey);
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
String titleValue = dataSnapshot.child("title").getValue().toString();
getSupportActionBar().setTitle(titleValue);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
这是 TestingActivity 类的完整代码。
在这里可以看到之前的活动(太大)。当我更改数据库中的某些内容时,您可以在这里看到日志。
谢谢!
解决方案
通过查看链接中提供的代码,您似乎正在启动TestingActivity
or EventSingleActivity
。
这是链接中的代码:
viewHolder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDatabase.child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String eventTime = dataSnapshot.child("timeStamp").getValue().toString();
if(Integer.parseInt(nowTime) > Integer.parseInt(eventTime)){
Intent intent = new Intent(PrincipalActivity.this, TestingActivity.class);
intent.putExtra("eventKey", id);
startActivity(intent);
finish();
} else {
Intent intent = new Intent(PrincipalActivity.this, EventSingleActivity.class);
intent.putExtra("eventKey", id);
startActivity(intent);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
});
这就是为什么 firebase db 的每一次更改都会启动我上面提到的活动。
要解决此问题,您需要执行以下操作:
mDatabase.child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
viewHolder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String eventTime = dataSnapshot.child("timeStamp").getValue().toString();
if(Integer.parseInt(nowTime) > Integer.parseInt(eventTime)){
Intent intent = new Intent(PrincipalActivity.this, TestingActivity.class);
intent.putExtra("eventKey", id);
startActivity(intent);
finish();
} else {
Intent intent = new Intent(PrincipalActivity.this, EventSingleActivity.class);
intent.putExtra("eventKey", id);
startActivity(intent);
}
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
推荐阅读
- c++ - 如何使用 mingw-w64 构建具有链接时间优化的 Qt?
- xml - 检索添加到项目的自定义字段中的值列表
- java - 使用 Spring Boot 禁用 AppClassLoader AspectJ 日志记录
- python - sys.stdin.readline() vs input():它们需要的内存有区别吗?
- asp.net - 通过 dynatrace 进行 Ping 操作?
- windows - 通过 CLI 检测 Windows HyperVisor
- r - 如何在 Opencpu 中将日期时间作为参数传递?
- c - 当两个或多个线程或进程 ftruncate(2) 同一个文件时会发生什么?
- javascript - React-table Filter 组件在重新渲染时丢失状态
- linux - Jenkins控制台以root用户而不是jenkins用户执行shell