Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
YGOMobile
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fallenstardust
YGOMobile
Commits
ec9c731a
Commit
ec9c731a
authored
Jul 14, 2025
by
fallenstardust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
使用迭代组安全过滤
parent
a7c03bd3
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
39 additions
and
33 deletions
+39
-33
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/DeckManagerFragment.java
...ava/cn/garymb/ygomobile/ui/cards/DeckManagerFragment.java
+2
-1
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/deck_square/DeckSquareApiUtil.java
...ymb/ygomobile/ui/cards/deck_square/DeckSquareApiUtil.java
+36
-31
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/deck_square/api_response/PushMultiDeck.java
...bile/ui/cards/deck_square/api_response/PushMultiDeck.java
+1
-1
No files found.
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/DeckManagerFragment.java
View file @
ec9c731a
...
@@ -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
)
->
{
});
});
}
}
...
...
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/deck_square/DeckSquareApiUtil.java
View file @
ec9c731a
...
@@ -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
)
{
...
...
mobile/src/main/java/cn/garymb/ygomobile/ui/cards/deck_square/api_response/PushMultiDeck.java
View file @
ec9c731a
...
@@ -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
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment