Commit ec9c731a authored by fallenstardust's avatar fallenstardust

使用迭代组安全过滤

parent a7c03bd3
...@@ -261,7 +261,8 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -261,7 +261,8 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
return 0; return 0;
}).fail((e) -> { }).fail((e) -> {
YGOUtil.showTextToast("Sync decks failed: " + e); LogUtil.e(TAG, "Sync decks failed: " + e);
//YGOUtil.showTextToast("Sync decks failed: " + e);
}).done((result) -> { }).done((result) -> {
}); });
} }
......
...@@ -8,6 +8,7 @@ import java.io.File; ...@@ -8,6 +8,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -357,6 +358,7 @@ public class DeckSquareApiUtil { ...@@ -357,6 +358,7 @@ public class DeckSquareApiUtil {
String deckContent = DeckSquareFileUtil.setDeckId(item.getDeckPath(), loginToken.getUserId(), item.getDeckId()); String deckContent = DeckSquareFileUtil.setDeckId(item.getDeckPath(), loginToken.getUserId(), item.getDeckId());
data.setDeckYdk(deckContent); data.setDeckYdk(deckContent);
LogUtil.w(TAG, "seesee syncMyDecks*要上传的 本地卡组: " + data.getDeckName()+"//"+data.getDeckId()+"//"+data.getDeckCoverCard1()+"//"+data.getDeckYdk());
dataList.add(data); dataList.add(data);
} }
return pushMultiDecks(dataList, loginToken); return pushMultiDecks(dataList, loginToken);
...@@ -692,52 +694,56 @@ public class DeckSquareApiUtil { ...@@ -692,52 +694,56 @@ public class DeckSquareApiUtil {
// 获取本地卡组列表 // 获取本地卡组列表
List<MyDeckItem> localDecks = DeckSquareFileUtil.getMyDeckItem(); List<MyDeckItem> localDecks = DeckSquareFileUtil.getMyDeckItem();
// 获取在线卡组列表 // 获取在线卡组列表
VUiKit.defer().when(() -> { MyDeckResponse onlineDecksResponse = DeckSquareApiUtil.getUserDecks(loginToken);
MyDeckResponse result = DeckSquareApiUtil.getUserDecks(loginToken);//调用获取云备份卡组的接口方法 if (onlineDecksResponse == null || onlineDecksResponse.getData() == null) {
if (result == null) return null; LogUtil.e(TAG, "load my online decks failed!");
else return result.getData(); return;
}).fail((e) -> { }
LogUtil.e(TAG, "load mycard from server failed: " + e); List<MyOnlineDeckDetail> onlineDecks = onlineDecksResponse.getData();
}).done((serverDecks) -> {
if (serverDecks != null) {//将服务端的卡组也放到OrignalData里,
DeckManagerFragment.getOriginalData().clear();
DeckManagerFragment.getOriginalData().addAll(serverDecks);
}
});
List<MyOnlineDeckDetail> onlineDecks = DeckManagerFragment.getOriginalData();
//遍历本地卡组与云备份卡组,过滤出差异项 // 缓存原始在线卡组(使用副本避免后续修改影响缓存)
DeckManagerFragment.getOriginalData().clear();
DeckManagerFragment.getOriginalData().addAll(new ArrayList<>(onlineDecks));
// 遍历本地卡组与云备份卡组,过滤差异项(使用迭代器避免ConcurrentModificationException)
List<MyDeckItem> syncUploadDecks = new ArrayList<>(); List<MyDeckItem> syncUploadDecks = new ArrayList<>();
List<MyDeckItem> newPushDecks = new ArrayList<>(); List<MyDeckItem> newPushDecks = new ArrayList<>();
List<MyOnlineDeckDetail> backupDownloadDecks = new ArrayList<>(); List<MyOnlineDeckDetail> backupDownloadDecks = new ArrayList<>();
for (MyDeckItem localDeck : localDecks) { // 1. 使用本地卡组的迭代器遍历(支持安全删除)
//预处理每个本地卡组 Iterator<MyDeckItem> localIterator = localDecks.iterator();
while (localIterator.hasNext()) {
MyDeckItem localDeck = localIterator.next();
// 预处理本地卡组
String localDeckName = localDeck.getDeckName().replace(Constants.YDK_FILE_EX, ""); String localDeckName = localDeck.getDeckName().replace(Constants.YDK_FILE_EX, "");
localDeck.setDeckName(localDeckName); localDeck.setDeckName(localDeckName);
localDeck.setDeckCoverCard1(DeckUtil.getFirstCardCode(localDeck.getDeckPath())); localDeck.setDeckCoverCard1(DeckUtil.getFirstCardCode(localDeck.getDeckPath()));
for (MyOnlineDeckDetail onlineDeck : onlineDecks) { boolean isMatched = false;
// 2. 使用在线卡组的迭代器遍历(支持安全删除)
Iterator<MyOnlineDeckDetail> onlineIterator = onlineDecks.iterator();
while (onlineIterator.hasNext()) {
MyOnlineDeckDetail onlineDeck = onlineIterator.next();
String onLineDeckName = onlineDeck.getDeckName().replace(Constants.YDK_FILE_EX, ""); String onLineDeckName = onlineDeck.getDeckName().replace(Constants.YDK_FILE_EX, "");
if (localDeckName.equals(onLineDeckName)) {
localDeck.setDeckId(onlineDeck.getDeckId());//为本地卡组添加同名云备份卡组的deckid
// 将每个本地卡组作为数组元素添加入syncUploadDecks
syncUploadDecks.add(localDeck);// 将匹配到的本地卡组放入待上传的list中
localDecks.remove(localDeck);// 移除云备份已存在的本地卡组,最后剩下的就是本地独有的卡组
onlineDecks.remove(onlineDeck);// 移除匹配到的云备份卡组,最后剩下的就是云备份独有的卡组
break; if (localDeckName.equals(onLineDeckName)) {
// 匹配到同名卡组:加入同步上传列表,并从原始集合中删除(避免重复处理)
localDeck.setDeckId(onlineDeck.getDeckId());
syncUploadDecks.add(localDeck);
localIterator.remove(); // 安全删除本地卡组(迭代器方法)
onlineIterator.remove(); // 安全删除在线卡组(迭代器方法)
isMatched = true;
break; // 匹配后跳出内部循环
} }
} }
// 若未匹配到在线卡组,该本地卡组会保留在localDecks中(后续作为新卡组上传)
} }
newPushDecks.addAll(localDecks);// 将剩下的本地卡组传入待新上传的list,与syncUploadDecks并不执行相同的上传接口 // 剩余的本地卡组都是新卡组(本地独有,需要上传)
backupDownloadDecks.addAll(onlineDecks);// 将剩下的在线卡组传入待新下载的list newPushDecks.addAll(localDecks);
// 剩余的在线卡组都是新卡组(云端独有,需要下载)
backupDownloadDecks.addAll(onlineDecks);
LogUtil.w(TAG, "seesee +要下载的 云备份卡组: " + backupDownloadDecks); LogUtil.w(TAG, "seesee +要下载的 云备份卡组: " + backupDownloadDecks);
for (MyOnlineDeckDetail onlineDeck : backupDownloadDecks) { for (MyOnlineDeckDetail onlineDeck : backupDownloadDecks) {
...@@ -762,7 +768,6 @@ public class DeckSquareApiUtil { ...@@ -762,7 +768,6 @@ public class DeckSquareApiUtil {
requestIdAndPushNewDecks(newPushDecks, loginToken); requestIdAndPushNewDecks(newPushDecks, loginToken);
LogUtil.w(TAG, "seesee +要上传的 本地卡组: " + newPushDecks); LogUtil.w(TAG, "seesee +要上传的 本地卡组: " + newPushDecks);
} }
} }
private static SyncMutliDeckResult.DownloadResult downloadMissingDeckToLocal(MyOnlineDeckDetail onlineDeck, Long onlineUpdateDate) { private static SyncMutliDeckResult.DownloadResult downloadMissingDeckToLocal(MyOnlineDeckDetail onlineDeck, Long onlineUpdateDate) {
......
...@@ -62,7 +62,7 @@ public class PushMultiDeck { ...@@ -62,7 +62,7 @@ public class PushMultiDeck {
this.deckName = deckName; this.deckName = deckName;
} }
public Integer getDeckCoverCard1(Integer firstCode) { public Integer getDeckCoverCard1() {
return deckCoverCard1; return deckCoverCard1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment