我有一个让我发疯的问题。
所以我有两种方法,一种用于阅读,另一种用于写作。
我有一个名为Converastion
的类,它包含ArrayList<ChatMessage>
和一些String
属性。 Converastion
和ChatMessage
都实现了Serializable
,我知道我可以将此Conversation
对象保存到FileSystem
。
但是当我尝试阅读它然后写它(更新Conversation
)时,它不能很好地工作。问题在于阅读,当我知道java.io.EOFException
对象以前总是被写过时,我总是得到Conversation
。
以下是我的两种方法:
public Conversation getConversation(String userId, boolean createByDefault){
try {
File f = new File(sApplicationContext.getFilesDir() + "/" + "Conversation" + "/" + userId);
FileInputStream fis = new FileInputStream(f);
ObjectInputStream in = new ObjectInputStream(fis);
Conversation ret = (Conversation) in.readObject();
in.close();
return ret;
} catch (Exception e) {
e.printStackTrace();
Conversation conv = new Conversation();
conv.userId = userId;
conv.usernameChat = userId + "@" + XMPPController.HOST;
if(createByDefault)
setConversation(conv);
return conv;
}
}
public void setConversation(Conversation conv){
try {
File dir = new File(sApplicationContext.getFilesDir(), "Conversation");
if(!dir.exists()) {
dir.mkdir();
}
File newFile = new File(sApplicationContext.getFilesDir(), "Conversation" + "/" + conv.userId);
newFile.createNewFile();
FileOutputStream fos = new FileOutputStream(newFile);
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(conv);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
现在我在循环中使用这些方法,这会导致问题。 onListIQ
多次强奸,一个来自另一个班级的听众。我甚至试图设置synchronized(this)
但没有运气,这是代码:
public void onListIQ(ListChatIQ listIQ){
// get the conversation
Conversation conv = getConversation(listIQ.userId, true);
// loop through messages
for(ChatIQ chat : listIQ.chatIqs){
// determine if message was from me or other user
String userId = listIQ.userId;
if(chat.fromMe){
userId = currentProfile.userId;
}
// create new message
ChatMessage cm = new ChatMessage();
cm.id = messageId;
cm.userId = userId;
cm.text = body;
cm.date = new Date();
// add message
conv.messages.add(cm);
}
// update the conversation with messages
setConversation(conv);
}
提前致谢