From 569ff1d1ec4b5ef2292a544fb2fc772c4845e377 Mon Sep 17 00:00:00 2001 From: farmery Date: Sat, 8 Mar 2025 13:45:57 +0100 Subject: [PATCH 1/2] Use a thread pool instead of a single worker thread --- .../FlutterSecureStoragePlugin.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/flutter_secure_storage/android/src/main/java/com/it_nomads/fluttersecurestorage/FlutterSecureStoragePlugin.java b/flutter_secure_storage/android/src/main/java/com/it_nomads/fluttersecurestorage/FlutterSecureStoragePlugin.java index bf28a2ee..47a4eaf9 100644 --- a/flutter_secure_storage/android/src/main/java/com/it_nomads/fluttersecurestorage/FlutterSecureStoragePlugin.java +++ b/flutter_secure_storage/android/src/main/java/com/it_nomads/fluttersecurestorage/FlutterSecureStoragePlugin.java @@ -1,7 +1,6 @@ package com.it_nomads.fluttersecurestorage; import android.os.Handler; -import android.os.HandlerThread; import android.os.Looper; import androidx.annotation.NonNull; @@ -10,6 +9,8 @@ import java.io.StringWriter; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.MethodCall; @@ -21,16 +22,15 @@ public class FlutterSecureStoragePlugin implements MethodCallHandler, FlutterPlu private MethodChannel channel; private FlutterSecureStorage secureStorage; - private HandlerThread workerThread; - private Handler workerThreadHandler; + private ExecutorService executor; private FlutterPluginBinding binding; @Override public void onAttachedToEngine(FlutterPluginBinding binding) { this.binding = binding; - workerThread = new HandlerThread("fluttersecurestorage.worker"); - workerThread.start(); - workerThreadHandler = new Handler(workerThread.getLooper()); + int threadCount = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + this.executor = Executors.newFixedThreadPool(threadCount); + channel = new MethodChannel(binding.getBinaryMessenger(), "plugins.it_nomads.com/flutter_secure_storage"); channel.setMethodCallHandler(this); } @@ -38,13 +38,13 @@ public void onAttachedToEngine(FlutterPluginBinding binding) { @Override public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { if (channel != null) { - if (workerThread != null) { - workerThread.quitSafely(); - workerThread = null; - } channel.setMethodCallHandler(null); channel = null; } + if (executor != null) { + executor.shutdown(); + executor = null; + } secureStorage = null; } @@ -69,7 +69,7 @@ private boolean initSecureStorage(Result result, Map options) { @Override public void onMethodCall(@NonNull MethodCall call, @NonNull Result rawResult) { MethodResultWrapper result = new MethodResultWrapper(rawResult); - workerThreadHandler.post(new MethodRunner(call, result)); + executor.execute(new MethodRunner(call, result)); } class MethodRunner implements Runnable { From e7b45a61c9f82d588df8bcfda936cfaf32b1e27f Mon Sep 17 00:00:00 2001 From: farmery Date: Sat, 8 Mar 2025 15:59:52 +0100 Subject: [PATCH 2/2] cap thread count --- .../fluttersecurestorage/FlutterSecureStoragePlugin.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flutter_secure_storage/android/src/main/java/com/it_nomads/fluttersecurestorage/FlutterSecureStoragePlugin.java b/flutter_secure_storage/android/src/main/java/com/it_nomads/fluttersecurestorage/FlutterSecureStoragePlugin.java index 47a4eaf9..ebecba16 100644 --- a/flutter_secure_storage/android/src/main/java/com/it_nomads/fluttersecurestorage/FlutterSecureStoragePlugin.java +++ b/flutter_secure_storage/android/src/main/java/com/it_nomads/fluttersecurestorage/FlutterSecureStoragePlugin.java @@ -28,7 +28,8 @@ public class FlutterSecureStoragePlugin implements MethodCallHandler, FlutterPlu @Override public void onAttachedToEngine(FlutterPluginBinding binding) { this.binding = binding; - int threadCount = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + int availableCores = Runtime.getRuntime().availableProcessors(); + int threadCount = Math.min(4, Math.max(2, availableCores)); this.executor = Executors.newFixedThreadPool(threadCount); channel = new MethodChannel(binding.getBinaryMessenger(), "plugins.it_nomads.com/flutter_secure_storage");