perf: coalesce project chat realtime reload bursts

This commit is contained in:
kris
2026-04-05 08:07:09 +08:00
parent 0bae3a78ec
commit 6083079be9
2 changed files with 164 additions and 11 deletions

View File

@@ -85,6 +85,9 @@ public class ProjectDetailActivity extends BossScreenActivity {
private final ExecutorService replyWaitExecutor = Executors.newSingleThreadExecutor();
private @Nullable BossRealtimeClient realtimeClient;
private final java.util.HashMap<String, Long> recentRealtimeEventTimestamps = new java.util.HashMap<>();
private boolean reloadInFlight;
private boolean pendingReload;
private boolean pendingReloadForcedScrollToBottom;
static final class ChromeBindings {
final boolean multiSelecting;
@@ -123,7 +126,7 @@ public class ProjectDetailActivity extends BossScreenActivity {
}
}
private static final class ProjectSnapshot {
static final class ProjectSnapshot {
final JSONObject payload;
final @Nullable JSONArray dispatchPlans;
final @Nullable JSONObject participantsPayload;
@@ -331,28 +334,61 @@ public class ProjectDetailActivity extends BossScreenActivity {
finish();
return;
}
if (reloadInFlight) {
pendingReload = true;
pendingReloadForcedScrollToBottom = pendingReloadForcedScrollToBottom || forcedScrollToBottom;
return;
}
renderNearBottom = isChatNearBottom();
renderForcedScrollToBottom = forcedScrollToBottom;
reloadInFlight = true;
setRefreshing(true);
executor.execute(() -> {
try {
ProjectSnapshot snapshot = fetchProjectSnapshot();
runOnUiThread(() -> renderProject(snapshot.payload, snapshot.dispatchPlans, snapshot.participantsPayload));
ProjectSnapshot snapshot = loadProjectSnapshotForRefresh();
runOnUiThread(() -> {
renderLoadedProjectSnapshot(snapshot);
finishReloadCycle();
});
} catch (Exception error) {
runOnUiThread(() -> {
setRefreshing(false);
composerSending = false;
updateComposerSendButtonState();
if (pendingOutgoingBubble == null && !masterAgentReplyWaiting) {
replaceContent(BossUi.buildEmptyCard(this, "项目详情加载失败:" + error.getMessage()));
} else {
showMessage("项目详情刷新失败:" + error.getMessage());
}
handleProjectReloadFailure(error);
finishReloadCycle();
});
}
});
}
ProjectSnapshot loadProjectSnapshotForRefresh() throws Exception {
return fetchProjectSnapshot();
}
void renderLoadedProjectSnapshot(ProjectSnapshot snapshot) {
renderProject(snapshot.payload, snapshot.dispatchPlans, snapshot.participantsPayload);
}
void handleProjectReloadFailure(Exception error) {
setRefreshing(false);
composerSending = false;
updateComposerSendButtonState();
if (pendingOutgoingBubble == null && !masterAgentReplyWaiting) {
replaceContent(BossUi.buildEmptyCard(this, "项目详情加载失败:" + error.getMessage()));
} else {
showMessage("项目详情刷新失败:" + error.getMessage());
}
}
private void finishReloadCycle() {
reloadInFlight = false;
if (!pendingReload) {
return;
}
boolean forcedScrollToBottom = pendingReloadForcedScrollToBottom;
pendingReload = false;
pendingReloadForcedScrollToBottom = false;
reload(forcedScrollToBottom);
}
@Override
protected void setRefreshing(boolean refreshing) {
super.setRefreshing(refreshing);