自己写代码 - HelloHi开发流水账 五 一枚臭虫
来源:互联网 发布:windows盗版的危害 编辑:程序博客网 时间:2024/05/01 04:26
至此发现了一个bug,有时候发一条消息会没有反应,然后多发几次刷出来一大串。调试进去看看发现设计上的失误。
updateMessage是异 步调用,成功后应该更新。但是由于是异步调用有可能出现这种情况,调用updateMessage,参数发出去了,在返回之前,又调用了一次,这时 lastIndex还没有更新,自然就会读出重复的信息。
于是我加了一个标记变量,调用updateMessage之后把isUpdating设 为true,以免再次调用,然后再onSuccess最后置回false
private boolean isUpdating = false;
private void update() {
if (clientId == -1) {
initClientId();
} else {
if (!isUpdating) {
isUpdating = true;
service.updateMessage(clientId, lastIndex, new AsyncCallback<HiMessage[]>() {
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(HiMessage[] result) {
if (result != null && result.length != 0) {
for (HiMessage message : result) {
if (message.getClientId() == clientId) {
contentPanel.add(new HiMessageUi("You:", message.getContent()));
} else {
contentPanel.add(new HiMessageUi("Stanger:", message.getContent()));
}
lastIndex++;
}
scrollPanel.scrollToBottom();
}
isUpdating = false;
}
});
}
}
}
private void update() {
if (clientId == -1) {
initClientId();
} else {
if (!isUpdating) {
isUpdating = true;
service.updateMessage(clientId, lastIndex, new AsyncCallback<HiMessage[]>() {
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(HiMessage[] result) {
if (result != null && result.length != 0) {
for (HiMessage message : result) {
if (message.getClientId() == clientId) {
contentPanel.add(new HiMessageUi("You:", message.getContent()));
} else {
contentPanel.add(new HiMessageUi("Stanger:", message.getContent()));
}
lastIndex++;
}
scrollPanel.scrollToBottom();
}
isUpdating = false;
}
});
}
}
}
呃,改后bug依然坚挺,悲剧地发现,这个bug不是这个原因造成的。而 是取信息的时候,相当无语地返回了所有的信息。。。改成这样就好了
@Override
public HiMessage[] updateMessage(int clientId, int lastIndex) {
ArrayList<HiMessage> messageList = clientMgr.getClient(clientId).getRoom().getMessageList();
if (lastIndex >= messageList.size()) {
return null;
}
HiMessage[] result = new HiMessage[messageList.size() - lastIndex];
messageList.subList(lastIndex, messageList.size()).toArray(result);
return result;
}
public HiMessage[] updateMessage(int clientId, int lastIndex) {
ArrayList<HiMessage> messageList = clientMgr.getClient(clientId).getRoom().getMessageList();
if (lastIndex >= messageList.size()) {
return null;
}
HiMessage[] result = new HiMessage[messageList.size() - lastIndex];
messageList.subList(lastIndex, messageList.size()).toArray(result);
return result;
}
而是取信息的时候,相当无语地返回了所有的信息。。。改成这样就好了
@Override
public HiMessage[] updateMessage(int clientId, int lastIndex) {
ArrayList<HiMessage> messageList = clientMgr.getClient(clientId).getRoom().getMessageList();
if (lastIndex >= messageList.size()) {
return null;
}
HiMessage[] result = new HiMessage[messageList.size() - lastIndex];
messageList.subList(lastIndex, messageList.size()).toArray(result);
return result;
}
public HiMessage[] updateMessage(int clientId, int lastIndex) {
ArrayList<HiMessage> messageList = clientMgr.getClient(clientId).getRoom().getMessageList();
if (lastIndex >= messageList.size()) {
return null;
}
HiMessage[] result = new HiMessage[messageList.size() - lastIndex];
messageList.subList(lastIndex, messageList.size()).toArray(result);
return result;
}
虽然如此,但是我认为之前的想法仍然是对的,异步调用不加锁是一种潜在的威胁,因此我还是保留了之前的修改。
- 自己写代码 - HelloHi开发流水账 五 一枚臭虫
- 自己写代码 - HelloHi开发流水账 一 先画个躯壳
- 自己写代码 - HelloHi开发流水账 二 先跑起来
- 自己写代码 - HelloHi开发流水账 四 不止是String
- 自己写代码 - HelloHi开发流水账 三 别再那么二
- 自己写代码 HelloHi开发日记 六 掰开Ui和逻辑
- 自己写的一点福利代码(一)
- 【流水账】利用闲置笔记本搭建自己的开发服务器
- 写给自己的流水账
- 深度学习一:自己写java代码,训练一个神经元
- 自己写代码
- 自己写的代码
- ESP8266开发中的流水账
- 自己驱动自己—Python代码写接口测试(一)
- 安卓开发之配置参数帮忙写代码 一
- 自己写的frameset代码
- 自己写的分页代码
- 自己写代码 - facebook4gwt Demo
- IE6 下 DIV 最小高度不能为 0 的解决方法
- 滚动的对联广告
- 读书笔记 - Derby Reference Manual(三)
- 嵌入式系统电源管理软件比较
- linux lib 动态库(2)
- 自己写代码 - HelloHi开发流水账 五 一枚臭虫
- 什么是搜索引擎优化?
- 获取WinCE进程的内存信息
- 共享内存 (shared memory)是 Unix下的多进程之间的通信方法
- 加密算法1
- REMOTE HOST IDENTIFICATION HAS CHANGED!
- Linux混合编程+log4cpp
- 广域网笔记
- StringUtil 用法