倒计时结束调用FirebaseDatabase setValue时应用崩溃,同代码其他项目正常
问题分析与修复方案
从崩溃日志可以看到核心错误是java.lang.ClassCastException: java.text.SimpleDateFormat cannot be cast to java.lang.String,这是导致应用崩溃的直接原因。
错误根源
在setViews方法中,你明明已经将时间格式化为字符串savecurrentTime,但在往HashMap里存time字段时,错误地传入了SimpleDateFormat对象currentTime,而非格式化后的字符串。Firebase无法将SimpleDateFormat对象直接序列化为字符串,因此抛出类型转换异常。
修复后的代码片段
修改setViews方法中的HashMap赋值部分:
HashMap<String, Object> coinsadd = new HashMap<>(); coinsadd.put("currentuser", currentuserid); coinsadd.put("coinsearn", cModel.one_user_cost); coinsadd.put("date", savecurrentDate); coinsadd.put("time", savecurrentTime); // 替换为格式化好的时间字符串 FirebaseDatabase.getInstance() .getReference() .child("UsedCompagin/" + "views") .child(cModel.userid) .child("user_view") .child(currentuserid) .setValue(coinsadd);
额外建议
- 增加用户登录状态校验:获取
currentuserid前先判断用户是否已登录,避免空指针崩溃:
FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser == null) { // 处理未登录逻辑,比如跳转登录页面 return; } String currentuserid = currentUser.getUid();
- 检查Firebase数据库规则:确保数据库规则允许当前用户写入目标节点,比如设置如下规则(根据实际需求调整):
{ "rules": { "UsedCompagin": { "views": { "$userid": { "user_view": { "$currentUid": { ".write": "auth != null && auth.uid == $currentUid" } } } } } } }
- 异常捕获:给Firebase操作添加
onCancelled的错误处理,方便排查后续问题:
@Override public void onCancelled(@NonNull DatabaseError databaseError) { Log.e("FirebaseError", "写入失败:" + databaseError.getMessage()); }
内容的提问来源于stack exchange,提问作者Matrix
相关产品推荐
相关产品推荐

