Android Studio中Firebase的onDataChange无限加载问题排查
Firebase Realtime Database onDataChange无限加载问题解决
问题背景
调用addListenerForSingleValueEvent()后,onDataChange()持续无限加载,无法从Firebase Realtime Database获取数据。该功能此前正常运行6个月,无征兆突然失效。已尝试重新安装google-services.json文件、检查数据库访问权限,均无效果。启用Firebase调试日志后,发现报错为com.google.firebase.database.tubesock.WebSocketException: unknown host: #####.firebaseio.com,问题与WiFi网络环境相关。
解决方法
在获取FirebaseDatabase实例后,添加goOffline()和goOnline()调用,重置数据库连接状态:
FirebaseDatabase database = FirebaseDatabase.getInstance(); // 重置数据库连接,解决WebSocket未知主机问题 database.goOffline(); database.goOnline(); DatabaseReference usersRef = database.getReference().child("users"); usersRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { if (!dataSnapshot.child(userName).exists()) { Toast.makeText(LogInActivity.this,"Incorrect credentials were entered!", Toast.LENGTH_SHORT).show(); return; } else if (!dataSnapshot.child(userName).child("password").getValue().toString().equals(et_enterPassword.getText().toString())) { Toast.makeText(LogInActivity.this,"Incorrect credentials were entered!", Toast.LENGTH_SHORT).show(); return; } Intent homePageIntent = new Intent(LogInActivity.this, HomePageActivity.class); startActivity(homePageIntent); } @Override public void onCancelled(DatabaseError databaseError) { Toast.makeText(LogInActivity.this,"An error occurred!", Toast.LENGTH_SHORT).show(); } });
说明
goOffline()会强制断开当前的WebSocket连接并清除缓存的连接状态,goOnline()则重新初始化与Firebase数据库的连接,以此解决因DNS解析异常或WebSocket连接状态紊乱导致的“未知主机”问题。
内容的提问来源于stack exchange,提问作者Daniel Rubinstein
相关产品推荐
相关产品推荐

