java–Android聊天在DataSnapshot.getValue()上崩溃,以获取时间戳

java–Android聊天在DataSnapshot.getValue()上崩溃,以获取时间戳,第1张

概述我正在尝试修改Firebase的Android聊天示例以包含Firebase时间戳值.我可以使用ServerValue.TIMESTAMP发送时间戳.但是当Firebase尝试显示该消息时,应用程序崩溃了.编辑:下面的完整错误输出发送我使用的消息privatevoidsendMessage(){EditTextinputText=(EditText)findV

我正在尝试修改Firebase的Android聊天示例以包含Firebase时间戳值.我可以使用ServerValue.TIMESTAMP发送时间戳.但是当Firebase尝试显示该消息时,应用程序崩溃了.编辑:下面的完整错误输出

发送我使用的消息

private voID sendMessage() {    EditText inputText = (EditText)findVIEwByID(R.ID.messageinput);    String input = inputText.getText().toString();    Map timestamp = ServerValue.TIMESTAMP;    if (!input.equals("")) {        // Create our 'model', a Chat object        Chat chat = new Chat(name, input, timestamp, userID);        // Create a new, auto-generated child of that chat location, and save our chat data there        chatRef.push().setValue(chat);        inputText.setText("");    }}

伪造的结构是这样的:

->Messenger  |--> room      |--> messages        |--> messageID          |--> from: "name"          |--> text: "Message"          |--> timestamp: xxxxxxxxxxxxx          |--> userID: "ID"

和Chat.java

public class Chat {    private String from;    private String text;    private int userID;    private Map<String, String> timestamp = new HashMap<String, String>();    // required default constructor for Firebase object mapPing    @SuppressWarnings("unused")    private Chat() { }    Chat(String from, String text, Map timestamp, int userID) {        this.from = from;        this.text = text;        this.timestamp = timestamp;        this.userID = userID;    }    public String getFrom() {        return from;    }    public String getText() {        return text;    }    public Map getTimestamp() {        return timestamp;    }    public int getuserID() {        return userID;    }}

如果我从Firebase上的邮件中删除时间戳字段,则该应用不会崩溃.

完整的错误消息如下:

08-26 15:08:08.223  18097-18097/com.firebase.androIDchat E/AndroIDRuntime﹕ FATAL EXCEPTION: main    Process: com.firebase.androIDchat, PID: 18097    com.firebase.clIEnt.FirebaseException: Failed to bounce to type            at com.firebase.clIEnt.DataSnapshot.getValue(DataSnapshot.java:185)            at com.firebase.androIDchat.Firebaselistadapter.onChildAdded(Firebaselistadapter.java:63)            at com.firebase.clIEnt.core.ChildListenerContainer.run(ChildListenerContainer.java:52)            at androID.os.Handler.handleCallback(Handler.java:733)            at androID.os.Handler.dispatchMessage(Handler.java:95)            at androID.os.Looper.loop(Looper.java:136)            at androID.app.ActivityThread.main(ActivityThread.java:5001)            at java.lang.reflect.Method.invokeNative(Native Method)            at java.lang.reflect.Method.invoke(Method.java:515)            at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)            at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:601)            at dalvik.system.NativeStart.main(Native Method)     Caused by: com.shaded.fasterxml.jackson.databind.JsonMapPingException: Can not deserialize instance of java.util.linkedHashMap out of VALUE_NUMBER_INT token            at [Source: java.io.StringReader@41f8c588; line: 1, column: 2] (through reference chain: com.firebase.androIDchat.Chat["timestamp"])            at com.shaded.fasterxml.jackson.databind.DeserializationContext.mapPingException(DeserializationContext.java:575)            at com.shaded.fasterxml.jackson.databind.DeserializationContext.mapPingException(DeserializationContext.java:569)            at com.shaded.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:310)            at com.shaded.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:26)            at com.shaded.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:464)            at com.shaded.fasterxml.jackson.databind.deser.impl.FIEldProperty.deserializeAndSet(FIEldProperty.java:107)            at com.shaded.fasterxml.jackson.databind.deser.BeanDeserializer.deserializefromObject(BeanDeserializer.java:295)            at com.shaded.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)            at com.shaded.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)            at com.shaded.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)            at com.firebase.clIEnt.DataSnapshot.getValue(DataSnapshot.java:181)            at com.firebase.androIDchat.Firebaselistadapter.onChildAdded(Firebaselistadapter.java:63)            at com.firebase.clIEnt.core.ChildListenerContainer.run(ChildListenerContainer.java:52)            at androID.os.Handler.handleCallback(Handler.java:733)            at androID.os.Handler.dispatchMessage(Handler.java:95)            at androID.os.Looper.loop(Looper.java:136)            at androID.app.ActivityThread.main(ActivityThread.java:5001)            at java.lang.reflect.Method.invokeNative(Native Method)            at java.lang.reflect.Method.invoke(Method.java:515)            at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)            at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:601)            at dalvik.system.NativeStart.main(Native Method)

看起来它可能是由另一个令我困惑的问题引起的……

Caused by: com.shaded.fasterxml.jackson.databind.JsonMapPingException: Can not deserialize instance of java.util.linkedHashMap out of VALUE_NUMBER_INT token        at [Source: java.io.StringReader@41f8c588; line: 1, column: 2] (through reference chain: com.firebase.androIDchat.Chat["timestamp"])

解决方法:

Firebase.ServerValue.TIMESTAMP设置为Map(包含{.sv:“timestamp”}),告诉Firebase使用服务器的时间填充该字段.当回读该数据时,它是实际的unix时间戳,它是一个Long.当Firebase(使用Jackson)尝试反序列化返回的值时,它会失败,因为它不是Map.

您可以使用Jackson annotations来控制类转换为JsON的方式.

例如,这样的东西应该工作:

import com.fasterxml.jackson.annotation.JsonIgnore;import com.firebase.clIEnt.ServerValue;public class Thing {    private String ID;    private Long creationDate;    public Thing() {    }    public Thing(String ID) {        this.ID = ID;    }    public String getID() {        return ID;    }    public java.util.Map<String, String> getCreationDate() {        return ServerValue.TIMESTAMP;    }    @JsonIgnore    public Long getCreationDateLong() {       return creationDate;    }    public voID setID(String ID) {        this.ID = ID;    }    public voID setCreationDate(Long creationDate) {        this.creationDate = creationDate;    }}
总结

以上是内存溢出为你收集整理的java – Android聊天在DataSnapshot.getValue()上崩溃,以获取时间戳全部内容,希望文章能够帮你解决java – Android聊天在DataSnapshot.getValue()上崩溃,以获取时间戳所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1102495.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存