perf: coalesce project chat realtime reload bursts
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user