Java 更新的全局变量不反映内部ValueEventListener';s取消方法
我目前正在测试ValueEventListener的Java 更新的全局变量不反映内部ValueEventListener';s取消方法,java,android,firebase,global-variables,Java,Android,Firebase,Global Variables,我目前正在测试ValueEventListener的onCancelled()方法,以实现正确的firebase错误管理。到目前为止,我已经取得了成功,onCancelled()的性能很好。我已为特定节点设置firebase规则,以返回权限被拒绝错误 但是我对onCancell()方法中如何管理全局变量感到困惑。为什么全局变量在onCancelled()内部调用时似乎保留其默认初始状态?外部变量的更新不会在该方法内部调用时反映,而是在从onDataChange()和其他活动内方法调用时反映 第2
onCancelled()
方法,以实现正确的firebase错误管理。到目前为止,我已经取得了成功,onCancelled()的性能很好。我已为特定节点设置firebase规则,以返回权限被拒绝错误
但是我对onCancell()方法中如何管理全局变量感到困惑。为什么全局变量在onCancelled()内部调用时似乎保留其默认初始状态?外部变量的更新不会在该方法内部调用时反映,而是在从onDataChange()
和其他活动内方法调用时反映
第2次更新:
插入firebase验证代码,添加测试流执行。还添加了@Doug Stevenson建议的日志输出。从日志来看,似乎onCancelled()只被调用了一次(在app onCreate()期间)。我想这就是给我的错误印象,currentSynId
从未改变过,因为它的值仍然是Hello代码>在那里,我以前没有查看after日志
但是现在我看到有一个日志W/RepoOperation:updateChildren at/2014失败:DatabaseError:Permission denied
,每次调用R.id.btn\u sync
时都会触发该日志(并且不再调用onCancelled
的日志,更新的currentSyncId
应该在哪里)。也许我应该重新表述我的问题?我想捕获当前取消日志触发的位置/时间。谢谢
第1次更新我从完整的代码中取出相关片段,并替换了以前的代码片段:
...
public class Demo extends AppCompatActivity {
// Database reference
private DatabaseReference mFirebaseMain2014;
//
private FirebaseAuth mAuth;
public String currentSyncId = "Hello!!!";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
// Initialize firebase auth
mAuth = FirebaseAuth.getInstance();
mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if(mAuth.getCurrentUser() != null) {
Log.d("MAIN", "A user was logged in: " + mAuth.getCurrentUser().getUid());
initDatabase(mAuth.getCurrentUser().getUid());
}
findViewById(R.id.btn_sync).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
syncData();
}
});
findViewById(R.id.btn_echovalue).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
printId();
}
});
}
});
}
/**
* Initialize database and listeners
* @param userid
*/
public void initDatabase(String userid){
Log.d("MAIN", "Initialized databases");
// Initialize database references
mFirebaseMain2014 = FirebaseDatabase.getInstance().getReference("2014");
mFirebaseMain2014.child("app_final/" + userid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// data processing here..
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("MAIN-ON-CANCELLED-EVENT", "An error occurred while syncing data: " +
databaseError.getMessage() + "\n id: " + currentSyncId);
}
});
}
/**
* Initiate firebase syncing (which will lead to Permission-Denied
*/
public void syncData(){
// Log values
Log.d("MAIN", "Initiating sync...");
currentSyncId = "00001";
// Set the dummy data that will be sent to firebase
HashMap map = new HashMap();
map.put(currentSyncId, "Hello, world!");
// Sync dummy data to firebase
mFirebaseMain2014.updateChildren(map);
Log.d("MAIN", "Sync called.");
}
/**
* Print the contents of global currentSyncId
*/
public void printId(){
Log.d("MAIN", "PRINTING CURRENT id value: " + currentSyncId + ", userid: " + getAuthUserId());
}
public String getAuthUserId(){
return mAuth.getCurrentUser().getUid();
}
}
onCancelled()
中的日志运行良好。我希望看到
MAIN: An error occurred while syncing data: Permission denied.
Sync ID: 0001
但是,我看到:
MAIN: An error occurred while syncing data: Permission denied.
Sync ID: Hello!!!
我需要跟踪触发onCancelled()
时的currentSyncId
,以便我可以将应用程序中的本地同步状态引用重置为false
我已经寻找过类似的案例和问题,但我找到的最接近的线索是如何调用onCancelled
和,以及一些参考资料。我发现了一个有趣的答案,但我不确定这是否也适用于firebase android
蒂亚 请编辑您的问题以显示完整的示例,而不仅仅是几个片段。如果没有所有的代码,不可能想象所有东西之间的交互。请添加您正在使用的代码。感谢大家的提醒@DougStevenson和Alex Mamo,我刚刚用完整的示例替换了这些代码片段。在每个方法中都添加日志行。看看它们发生的顺序。关于工作原理,这告诉了你什么?嗨,我已经添加了一些日志并修改了一些代码示例。我看到onCancelled
似乎只在onCreate()
上调用了一次,而且再也没有调用过。但是在哪里调用W/RepoOperation:updateChildren at/2014失败:DatabaseError:Permission denied
?我想这就是我想要抓住的。谢谢@DougStevenson
MAIN: An error occurred while syncing data: Permission denied.
Sync ID: Hello!!!