Java 更新的全局变量不反映内部ValueEventListener';s取消方法

Java 更新的全局变量不反映内部ValueEventListener';s取消方法,java,android,firebase,global-variables,Java,Android,Firebase,Global Variables,我目前正在测试ValueEventListener的onCancelled()方法,以实现正确的firebase错误管理。到目前为止,我已经取得了成功,onCancelled()的性能很好。我已为特定节点设置firebase规则,以返回权限被拒绝错误 但是我对onCancell()方法中如何管理全局变量感到困惑。为什么全局变量在onCancelled()内部调用时似乎保留其默认初始状态?外部变量的更新不会在该方法内部调用时反映,而是在从onDataChange()和其他活动内方法调用时反映 第2

我目前正在测试ValueEventListener的
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!!!