概述
微信发送图片、视频的功能很多人都用过,不知道是否有人注意到了它是无序的。从相册中选择图片、视频时有序号,但是发送出去却是乱序。对社交app来说这无可厚非,但是办公软件无序发送并不友好
现状
发送消息到服务端没有提供批量接口,批量发送功能采用发送单个消息的接口实现
java
ExecutorService executor = Executors.newSingleThreadExecutor();
// 批量发送消息
public void sendMediaMessages(ArrayList<MediaItemEntity> meidaItems) {
executor.submit(new Runnable() {
@Override
public void run() {
// 遍历选中的文件依次发送
for (int i = 0; i < meidaItems.size(); i++) {
MediaItemEntity mediaItem = meidaItems.get(i);
sendMedia(mediaItem);
}
}
});
}
// 发送单条消息
private Excute sendMedia(MediaItemEntity mediaItem) {
Excute message = new Excute(mediaItem);
doSend(message);
return message;
}
// 发送消息
private boolean doSend(Excute message) {
Result result = sendRequest(message.id, 3000L);
if (result != null) {
return result.isSuccess();
}
return false;
}
// 发送到服务端
private Result sendRequest(int id, long timeout) {
Result result = new Result();
MsgCallback callback = new MsgCallback();
TimeoutCallback timeoutCallback = new TimeoutCallback(timeout);
// 异步发送消息
Process process = new Process(id, callback, timeoutCallback);
boolean ret = process.start();
result.setSuccess(ret);
return result;
}
修改方案
只能客户端修改,服务端保持不变。而且发送单条消息改动影响点很多,也要尽量不动
java
// 只要保证这个方法是同步的就能解决问题,性能影响暂不考虑
// 最小改动:新增一个重载方法保证同步
private Excute sendMedia(MediaItemEntity mediaItem) {
Excute message = new Excute(mediaItem);
doSend(message);
return message;
}