
我正在尝试修改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()上崩溃,以获取时间戳所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)