Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 0b794ea

Browse files
author
Emmanuel Garcia
committed
tweaks
1 parent ea25323 commit 0b794ea

File tree

1 file changed

+25
-43
lines changed

1 file changed

+25
-43
lines changed

shell/platform/android/io/flutter/embedding/engine/dart/DartMessenger.java

Lines changed: 25 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import java.util.List;
1818
import java.util.Map;
1919
import java.util.WeakHashMap;
20-
import java.util.concurrent.ConcurrentHashMap;
2120
import java.util.concurrent.ExecutorService;
2221
import java.util.concurrent.Executors;
2322
import java.util.concurrent.ThreadFactory;
@@ -41,21 +40,17 @@ class DartMessenger implements BinaryMessenger, PlatformMessageHandler {
4140
*
4241
* <p>Reads and writes to this map must lock {@code handlersLock}.
4342
*/
44-
@NonNull
45-
private final ConcurrentHashMap<String, HandlerInfo> messageHandlers = new ConcurrentHashMap<>();
43+
@NonNull private final Map<String, HandlerInfo> messageHandlers = new HashMap<>();
4644

4745
/**
48-
* Maps a channel name to queue of task dispatchers. This queue is processed when the channel
49-
* handler is registered.
46+
* Maps a channel name to an object that holds information about the incoming Dart message.
5047
*
5148
* <p>Reads and writes to this map must lock {@code handlersLock}.
5249
*/
53-
@NonNull
54-
private final ConcurrentHashMap<String, List<DelayedMessageInfo>> delayedTaskDispatcher =
55-
new ConcurrentHashMap<>();
50+
@NonNull private final Map<String, List<BufferedMessageInfo>> bufferedMessages = new HashMap<>();
5651

5752
@NonNull private final Object handlersLock = new Object();
58-
private boolean canDelayTasks = false;
53+
private boolean enableBufferingIncomingMessages = false;
5954

6055
@NonNull private final Map<Integer, BinaryMessenger.BinaryReply> pendingReplies = new HashMap<>();
6156
private int nextReplyId = 1;
@@ -113,12 +108,12 @@ private static class HandlerInfo {
113108
* Holds information that allows to dispatch a Dart message to a platform handler when it becomes
114109
* available.
115110
*/
116-
private static class DelayedMessageInfo {
111+
private static class BufferedMessageInfo {
117112
@NonNull public final ByteBuffer message;
118113
int replyId;
119114
long messageData;
120115

121-
DelayedMessageInfo(@NonNull ByteBuffer message, int replyId, long messageData) {
116+
BufferedMessageInfo(@NonNull ByteBuffer message, int replyId, long messageData) {
122117
this.message = message;
123118
this.replyId = replyId;
124119
this.messageData = messageData;
@@ -179,31 +174,17 @@ public void setMessageHandler(
179174
}
180175
}
181176
Log.v(TAG, "Setting handler for channel '" + channel + "'");
182-
synchronized (handlersLock) {
183-
messageHandlers.put(channel, new HandlerInfo(handler, dartMessengerTaskQueue));
184-
}
185-
runDelayedTasksForChannel(channel);
186-
}
187177

188-
/**
189-
* Runs the tasks that handle messages received from Dart for the provided channel name.
190-
*
191-
* <p>The channel may not have associated tasks if it was registered prior to reciving the first
192-
* message from Dart.
193-
*
194-
* @param channel The channel name.
195-
*/
196-
public void runDelayedTasksForChannel(@NonNull String channel) {
197-
LinkedList<DelayedMessageInfo> list;
178+
LinkedList<BufferedMessageInfo> list;
198179
synchronized (handlersLock) {
199-
if (!delayedTaskDispatcher.contains(channel)) {
180+
messageHandlers.put(channel, new HandlerInfo(handler, dartMessengerTaskQueue));
181+
if (!bufferedMessages.containsKey(channel)) {
200182
return;
201183
}
202-
list = (LinkedList) delayedTaskDispatcher.get(channel);
203-
delayedTaskDispatcher.remove(channel);
184+
list = (LinkedList) bufferedMessages.get(channel);
185+
bufferedMessages.remove(channel);
204186
}
205-
while (!list.isEmpty()) {
206-
final DelayedMessageInfo info = list.poll();
187+
for (BufferedMessageInfo info : list) {
207188
dispatchMessageToQueue(
208189
channel, messageHandlers.get(channel), info.message, info.replyId, info.messageData);
209190
}
@@ -216,8 +197,8 @@ public void runDelayedTasksForChannel(@NonNull String channel) {
216197
* be initialized concurrently, and prior to the registration of the channel handlers. This
217198
* implies that Dart may start sending messages while plugins are being registered.
218199
*/
219-
public void enableDelayedTaskQueue() {
220-
canDelayTasks = true;
200+
public void enableBufferingIncomingMessages() {
201+
enableBufferingIncomingMessages = true;
221202
}
222203

223204
@Override
@@ -287,9 +268,9 @@ private void dispatchMessageToQueue(
287268
message.limit(0);
288269
}
289270
} finally {
290-
Trace.endSection();
291271
// This is deleting the data underneath the message object.
292272
flutterJNI.cleanupMessageData(messageData);
273+
Trace.endSection();
293274
}
294275
};
295276
final DartMessengerTaskQueue nonnullTaskQueue =
@@ -304,10 +285,11 @@ public void handleMessageFromDart(
304285
Log.v(TAG, "Received message from Dart over channel '" + channel + "'");
305286

306287
HandlerInfo handlerInfo;
288+
boolean messageDeferred;
307289
synchronized (handlersLock) {
308-
if (messageHandlers.contains(channel)) {
309-
handlerInfo = messageHandlers.get(channel);
310-
} else if (canDelayTasks) {
290+
handlerInfo = messageHandlers.get(channel);
291+
messageDeferred = (enableBufferingIncomingMessages && handlerInfo == null);
292+
if (messageDeferred) {
311293
// The channel is not defined when the Dart VM sends a message before the channels are
312294
// registered.
313295
//
@@ -316,15 +298,15 @@ public void handleMessageFromDart(
316298
//
317299
// In such cases, the task dispatchers are queued, and processed when the channel is
318300
// defined.
319-
if (!delayedTaskDispatcher.contains(channel)) {
320-
delayedTaskDispatcher.put(channel, new LinkedList<>());
301+
if (!bufferedMessages.containsKey(channel)) {
302+
bufferedMessages.put(channel, new LinkedList<>());
321303
}
322-
List<Runnable> delayedTaskQueue = delayedTaskDispatcher.get(channel);
323-
delayedTaskQueue.add(new DelayedMessageInfo(message, replyId, messageData));
304+
List<BufferedMessageInfo> buffer = bufferedMessages.get(channel);
305+
buffer.add(new BufferedMessageInfo(message, replyId, messageData));
324306
}
325307
}
326-
if (handlerInfo != null) {
327-
dispatchMessageToQueue(handlerInfo, message, replyId, messageData);
308+
if (!messageDeferred) {
309+
dispatchMessageToQueue(channel, handlerInfo, message, replyId, messageData);
328310
}
329311
}
330312

0 commit comments

Comments
 (0)