From bd1a72dfac7ee198f2682077e1b3f9358538a3d3 Mon Sep 17 00:00:00 2001 From: YangJiakang Date: Sat, 15 Oct 2022 22:15:16 +0800 Subject: [PATCH 1/3] support multiple engine for texture on the Android side --- .../com/taobao/power_image/PowerImagePlugin.java | 9 ++++++--- .../request/PowerImageRequestManager.java | 15 ++++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java b/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java index 495c41e..070b052 100644 --- a/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java +++ b/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java @@ -26,7 +26,7 @@ public class PowerImagePlugin implements FlutterPlugin, MethodCallHandler { /// when the Flutter Engine is detached from the Activity private MethodChannel methodChannel; private EventChannel eventChannel; - private static Context sContext; + private static Context sContext; public static Context getContext(){ return sContext; @@ -36,11 +36,14 @@ public static Context getContext(){ System.loadLibrary("powerimage"); } + private String engineId; + @Override public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) { if(sContext == null){ sContext = flutterPluginBinding.getApplicationContext(); } + engineId = String.valueOf(flutterPluginBinding.getFlutterEngine().hashCode()); methodChannel = new MethodChannel( flutterPluginBinding.getBinaryMessenger(), "power_image/method"); methodChannel.setMethodCallHandler(this); @@ -48,7 +51,7 @@ public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) { flutterPluginBinding.getBinaryMessenger(), "power_image/event"); eventChannel.setStreamHandler(PowerImageEventSink.getInstance()); PowerImageRequestManager.getInstance() - .configWithTextureRegistry(flutterPluginBinding.getTextureRegistry()); + .configWithTextureRegistry(engineId, flutterPluginBinding.getTextureRegistry()); PowerImageDispatcher.getInstance().prepare(); } @@ -64,7 +67,7 @@ public void onMethodCall(MethodCall call, Result result) { if (call.arguments instanceof List) { List arguments = (List) call.arguments; List results = PowerImageRequestManager.getInstance() - .configRequestsWithArguments(arguments); + .configRequestsWithArguments(engineId, arguments); result.success(results); PowerImageRequestManager.getInstance().startLoadingWithArguments(arguments); } else { diff --git a/android/src/main/java/com/taobao/power_image/request/PowerImageRequestManager.java b/android/src/main/java/com/taobao/power_image/request/PowerImageRequestManager.java index 2f3607d..6e8f601 100644 --- a/android/src/main/java/com/taobao/power_image/request/PowerImageRequestManager.java +++ b/android/src/main/java/com/taobao/power_image/request/PowerImageRequestManager.java @@ -17,7 +17,7 @@ public class PowerImageRequestManager { private Map requests; - private WeakReference textureRegistryWrf; + private HashMap> textureRegistryWrfMap = new HashMap<>(); private PowerImageRequestManager() { requests = new HashMap<>(); @@ -31,11 +31,12 @@ public static PowerImageRequestManager getInstance() { return Holder.instance; } - public void configWithTextureRegistry(TextureRegistry textureRegistry) { - textureRegistryWrf = new WeakReference<>(textureRegistry); + public void configWithTextureRegistry(String key, TextureRegistry textureRegistry) { + WeakReference textureRegistryWrf = new WeakReference<>(textureRegistry); + textureRegistryWrfMap.put(key, textureRegistryWrf); } - public List> configRequestsWithArguments(List> list) { + public List> configRequestsWithArguments(String key, List> list) { List> results = new ArrayList<>(); if (list == null || list.isEmpty()) { return results; @@ -47,7 +48,11 @@ public List> configRequestsWithArguments(List textureRegistryWeakReference = textureRegistryWrfMap.get(key); + if (textureRegistryWeakReference == null) { + return results; + } + request = new PowerImageTextureRequest(arguments, textureRegistryWeakReference.get()); } else { continue; } From 14bffaa221c3e6d66e4e77b428cd4b680c5576ec Mon Sep 17 00:00:00 2001 From: YangJiakang Date: Sat, 19 Nov 2022 20:37:43 +0800 Subject: [PATCH 2/3] introduce PowerImageEngineContext for mutiengine. --- .../power_image/PowerImageEngineContext.java | 118 ++++++++++++++++++ .../taobao/power_image/PowerImagePlugin.java | 103 +++------------ .../dispatcher/PowerImageDispatcher.java | 5 + .../request/PowerImageBaseRequest.java | 16 +-- .../request/PowerImageExternalRequest.java | 5 +- .../request/PowerImageRequestManager.java | 32 ++--- .../request/PowerImageTextureRequest.java | 6 +- 7 files changed, 167 insertions(+), 118 deletions(-) create mode 100644 android/src/main/java/com/taobao/power_image/PowerImageEngineContext.java diff --git a/android/src/main/java/com/taobao/power_image/PowerImageEngineContext.java b/android/src/main/java/com/taobao/power_image/PowerImageEngineContext.java new file mode 100644 index 0000000..21f9e2e --- /dev/null +++ b/android/src/main/java/com/taobao/power_image/PowerImageEngineContext.java @@ -0,0 +1,118 @@ +package com.taobao.power_image; + +import androidx.annotation.NonNull; + +import com.taobao.power_image.request.PowerImageRequestManager; + +import java.util.List; +import java.util.Map; + +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.view.TextureRegistry; + +/** + * created by Yangjiakang on 2022/11/19 + */ +public class PowerImageEngineContext implements MethodChannel.MethodCallHandler { + + private final PowerImageRequestManager powerImageRequestManager; + private final PowerImageEventSink powerImageEventSink; + + /// The MethodChannel that will the communication between Flutter and native Android + /// + /// This local reference serves to register the plugin with the Flutter Engine and unregister it + /// when the Flutter Engine is detached from the Activity + private MethodChannel methodChannel; + private EventChannel eventChannel; + + public PowerImageEngineContext(FlutterPlugin.FlutterPluginBinding flutterPluginBinding) { + powerImageRequestManager = new PowerImageRequestManager(this); + powerImageEventSink = new PowerImageEventSink(); + + methodChannel = new MethodChannel( + flutterPluginBinding.getBinaryMessenger(), "power_image/method"); + methodChannel.setMethodCallHandler(this); + eventChannel = new EventChannel( + flutterPluginBinding.getBinaryMessenger(), "power_image/event"); + eventChannel.setStreamHandler(powerImageEventSink); + + configWithTextureRegistry(flutterPluginBinding.getTextureRegistry()); + } + + public void configWithTextureRegistry(TextureRegistry textureRegistry) { + powerImageRequestManager.configWithTextureRegistry(textureRegistry); + } + + public List> configRequestsWithArguments(List> list) { + return powerImageRequestManager.configRequestsWithArguments(list); + } + + public void startLoadingWithArguments(List arguments) { + powerImageRequestManager.startLoadingWithArguments(arguments); + } + + public List> releaseRequestsWithArguments(List arguments) { + return powerImageRequestManager.releaseRequestsWithArguments(arguments); + } + + public PowerImageEventSink getPowerImageEventSink() { + return powerImageEventSink; + } + + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { + if ("startImageRequests".equals(call.method)) { + if (call.arguments instanceof List) { + List arguments = (List) call.arguments; + List results = configRequestsWithArguments(arguments); + result.success(results); + startLoadingWithArguments(arguments); + } else { + throw new IllegalArgumentException("startImageRequests require List arguments"); + } + } else if ("releaseImageRequests".equals(call.method)) { + if (call.arguments instanceof List) { + List arguments = (List) call.arguments; + List results = releaseRequestsWithArguments(arguments); + result.success(results); + } else { + throw new IllegalArgumentException("stopImageRequests require List arguments"); + } + } else { + result.notImplemented(); + } + } + + public void onDetached() { + methodChannel.setMethodCallHandler(null); + eventChannel.setStreamHandler(null); + } + + public static class PowerImageEventSink implements EventChannel.StreamHandler { + + private EventChannel.EventSink eventSink; + + @Override + public void onListen(Object arguments, EventChannel.EventSink events) { + eventSink = events; + } + + @Override + public void onCancel(Object arguments) { + eventSink = null; + } + + public void sendImageStateEvent(Map event, boolean success) { + if (eventSink == null || event == null) { + return; + } + event.put("eventName", "onReceiveImageEvent"); + event.put("success", success); + eventSink.success(event); + } + } + +} diff --git a/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java b/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java index 070b052..0d845ef 100644 --- a/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java +++ b/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java @@ -3,32 +3,26 @@ import android.content.Context; +import androidx.annotation.NonNull; + import com.taobao.power_image.dispatcher.PowerImageDispatcher; -import com.taobao.power_image.request.PowerImageRequestManager; -import java.util.List; +import java.util.HashMap; import java.util.Map; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.EventChannel; -import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.MethodChannel.MethodCallHandler; -import io.flutter.plugin.common.MethodChannel.Result; /** * PowerImagePlugin */ -public class PowerImagePlugin implements FlutterPlugin, MethodCallHandler { - /// The MethodChannel that will the communication between Flutter and native Android - /// - /// This local reference serves to register the plugin with the Flutter Engine and unregister it - /// when the Flutter Engine is detached from the Activity - private MethodChannel methodChannel; - private EventChannel eventChannel; +public class PowerImagePlugin implements FlutterPlugin { + private static Context sContext; - - public static Context getContext(){ + public static Map powerImageEngineContextMap = new HashMap<>(); + + public static Context getContext() { return sContext; } @@ -39,87 +33,26 @@ public static Context getContext(){ private String engineId; @Override - public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) { - if(sContext == null){ + public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { + if (sContext == null) { sContext = flutterPluginBinding.getApplicationContext(); } + PowerImageEngineContext engineContext = new PowerImageEngineContext(flutterPluginBinding); engineId = String.valueOf(flutterPluginBinding.getFlutterEngine().hashCode()); - methodChannel = new MethodChannel( - flutterPluginBinding.getBinaryMessenger(), "power_image/method"); - methodChannel.setMethodCallHandler(this); - eventChannel = new EventChannel( - flutterPluginBinding.getBinaryMessenger(), "power_image/event"); - eventChannel.setStreamHandler(PowerImageEventSink.getInstance()); - PowerImageRequestManager.getInstance() - .configWithTextureRegistry(engineId, flutterPluginBinding.getTextureRegistry()); + powerImageEngineContextMap.put(engineId, engineContext); PowerImageDispatcher.getInstance().prepare(); } @Override public void onDetachedFromEngine(FlutterPluginBinding binding) { - methodChannel.setMethodCallHandler(null); - eventChannel.setStreamHandler(null); - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - if ("startImageRequests".equals(call.method)) { - if (call.arguments instanceof List) { - List arguments = (List) call.arguments; - List results = PowerImageRequestManager.getInstance() - .configRequestsWithArguments(engineId, arguments); - result.success(results); - PowerImageRequestManager.getInstance().startLoadingWithArguments(arguments); - } else { - throw new IllegalArgumentException("startImageRequests require List arguments"); - } - } else if ("releaseImageRequests".equals(call.method)) { - if (call.arguments instanceof List) { - List arguments = (List) call.arguments; - List results = PowerImageRequestManager.getInstance().releaseRequestsWithArguments(arguments); - result.success(results); - } else { - throw new IllegalArgumentException("stopImageRequests require List arguments"); - } - } else { - result.notImplemented(); + PowerImageEngineContext engineContext = getEngineContext(); + if (engineContext != null) { + engineContext.onDetached(); } + powerImageEngineContextMap.remove(engineId); } - public static class PowerImageEventSink implements EventChannel.StreamHandler { - - private EventChannel.EventSink eventSink; - - private PowerImageEventSink() { - } - - private static class Holder { - private final static PowerImageEventSink instance = new PowerImageEventSink(); - } - - public static PowerImageEventSink getInstance() { - return PowerImageEventSink.Holder.instance; - } - - @Override - public void onListen(Object arguments, EventChannel.EventSink events) { - eventSink = events; - } - - @Override - public void onCancel(Object arguments) { - eventSink = null; - } - - public void sendImageStateEvent(Map event, boolean success) { - if (eventSink == null || event == null) { - return; - } - - event.put("eventName", "onReceiveImageEvent"); - event.put("success", success); - eventSink.success(event); - } - + public PowerImageEngineContext getEngineContext() { + return powerImageEngineContextMap.get(engineId); } } diff --git a/android/src/main/java/com/taobao/power_image/dispatcher/PowerImageDispatcher.java b/android/src/main/java/com/taobao/power_image/dispatcher/PowerImageDispatcher.java index 50401d4..e7f5fdb 100644 --- a/android/src/main/java/com/taobao/power_image/dispatcher/PowerImageDispatcher.java +++ b/android/src/main/java/com/taobao/power_image/dispatcher/PowerImageDispatcher.java @@ -14,6 +14,7 @@ public class PowerImageDispatcher { private static volatile PowerImageDispatcher sInstance; + private boolean isPrepared = false; private Handler workHandler; private Handler mainHandler; private Looper workLooper; @@ -30,6 +31,10 @@ public static PowerImageDispatcher getInstance() { } public void prepare() { + if (isPrepared) { + return; + } + isPrepared = true; mainHandler = new Handler(Looper.getMainLooper()); Thread workThread = new Thread(new Runnable() { @Override diff --git a/android/src/main/java/com/taobao/power_image/request/PowerImageBaseRequest.java b/android/src/main/java/com/taobao/power_image/request/PowerImageBaseRequest.java index 51018bd..f0adbcf 100644 --- a/android/src/main/java/com/taobao/power_image/request/PowerImageBaseRequest.java +++ b/android/src/main/java/com/taobao/power_image/request/PowerImageBaseRequest.java @@ -1,8 +1,6 @@ package com.taobao.power_image.request; -import android.graphics.Bitmap; - -import com.taobao.power_image.PowerImagePlugin; +import com.taobao.power_image.PowerImageEngineContext; import com.taobao.power_image.dispatcher.PowerImageDispatcher; import com.taobao.power_image.loader.FlutterMultiFrameImage; import com.taobao.power_image.loader.PowerImageLoader; @@ -26,12 +24,14 @@ public abstract class PowerImageBaseRequest { public static final String RENDER_TYPE_EXTERNAL = "external"; public static final String RENDER_TYPE_TEXTURE = "texture"; + private final PowerImageEngineContext engineContext; private PowerImageRequestConfig imageRequestConfig; String requestId; protected String imageTaskState; protected PowerImageResult realResult; - public PowerImageBaseRequest(Map arguments) { + public PowerImageBaseRequest(PowerImageEngineContext context, Map arguments) { + engineContext = context; requestId = (String) arguments.get("uniqueKey"); imageRequestConfig = PowerImageRequestConfig.requestConfigWithArguments(arguments); } @@ -68,7 +68,7 @@ public void onResult(PowerImageResult result) { ); } - void onLoadResult(PowerImageResult result){ + void onLoadResult(PowerImageResult result) { this.realResult = result; } @@ -77,7 +77,7 @@ public void onLoadSuccess() { @Override public void run() { PowerImageBaseRequest.this.imageTaskState = REQUEST_STATE_LOAD_SUCCEED; - PowerImagePlugin.PowerImageEventSink.getInstance() + engineContext.getPowerImageEventSink() .sendImageStateEvent(PowerImageBaseRequest.this.encode(), true); } }); @@ -90,7 +90,7 @@ public void run() { PowerImageBaseRequest.this.imageTaskState = REQUEST_STATE_LOAD_FAILED; Map event = PowerImageBaseRequest.this.encode(); event.put("errMsg", errMsg != null ? errMsg : "failed!"); - PowerImagePlugin.PowerImageEventSink.getInstance() + engineContext.getPowerImageEventSink() .sendImageStateEvent(event, false); } }); @@ -104,7 +104,7 @@ public Map encode() { Map encodedTask = new HashMap<>(); encodedTask.put("uniqueKey", requestId); encodedTask.put("state", imageTaskState); - if(realResult != null && realResult.success && realResult.image instanceof FlutterMultiFrameImage){ + if (realResult != null && realResult.success && realResult.image instanceof FlutterMultiFrameImage) { encodedTask.put("_multiFrame", true); } return encodedTask; diff --git a/android/src/main/java/com/taobao/power_image/request/PowerImageExternalRequest.java b/android/src/main/java/com/taobao/power_image/request/PowerImageExternalRequest.java index fe712a6..9374fea 100644 --- a/android/src/main/java/com/taobao/power_image/request/PowerImageExternalRequest.java +++ b/android/src/main/java/com/taobao/power_image/request/PowerImageExternalRequest.java @@ -5,6 +5,7 @@ import android.graphics.drawable.Drawable; import android.os.Build; +import com.taobao.power_image.PowerImageEngineContext; import com.taobao.power_image.loader.FlutterMultiFrameImage; import com.taobao.power_image.loader.PowerImageResult; @@ -28,8 +29,8 @@ public class PowerImageExternalRequest extends PowerImageBaseRequest { private long handle; private int length; - public PowerImageExternalRequest(Map arguments) { - super(arguments); + public PowerImageExternalRequest(PowerImageEngineContext context, Map arguments) { + super(context, arguments); } @Override diff --git a/android/src/main/java/com/taobao/power_image/request/PowerImageRequestManager.java b/android/src/main/java/com/taobao/power_image/request/PowerImageRequestManager.java index 6e8f601..ed7c717 100644 --- a/android/src/main/java/com/taobao/power_image/request/PowerImageRequestManager.java +++ b/android/src/main/java/com/taobao/power_image/request/PowerImageRequestManager.java @@ -3,6 +3,8 @@ import static com.taobao.power_image.request.PowerImageBaseRequest.RENDER_TYPE_EXTERNAL; import static com.taobao.power_image.request.PowerImageBaseRequest.RENDER_TYPE_TEXTURE; +import com.taobao.power_image.PowerImageEngineContext; + import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; @@ -16,27 +18,21 @@ */ public class PowerImageRequestManager { + private final PowerImageEngineContext engineContext; + private Map requests; - private HashMap> textureRegistryWrfMap = new HashMap<>(); + private WeakReference textureRegistryWrf; - private PowerImageRequestManager() { + public PowerImageRequestManager(PowerImageEngineContext context) { + engineContext = context; requests = new HashMap<>(); } - private static class Holder { - private final static PowerImageRequestManager instance = new PowerImageRequestManager(); - } - - public static PowerImageRequestManager getInstance() { - return Holder.instance; - } - - public void configWithTextureRegistry(String key, TextureRegistry textureRegistry) { - WeakReference textureRegistryWrf = new WeakReference<>(textureRegistry); - textureRegistryWrfMap.put(key, textureRegistryWrf); + public void configWithTextureRegistry(TextureRegistry textureRegistry) { + this.textureRegistryWrf = new WeakReference<>(textureRegistry); } - public List> configRequestsWithArguments(String key, List> list) { + public List> configRequestsWithArguments(List> list) { List> results = new ArrayList<>(); if (list == null || list.isEmpty()) { return results; @@ -46,13 +42,9 @@ public List> configRequestsWithArguments(String key, List textureRegistryWeakReference = textureRegistryWrfMap.get(key); - if (textureRegistryWeakReference == null) { - return results; - } - request = new PowerImageTextureRequest(arguments, textureRegistryWeakReference.get()); + request = new PowerImageTextureRequest(engineContext, arguments, textureRegistryWrf.get()); } else { continue; } diff --git a/android/src/main/java/com/taobao/power_image/request/PowerImageTextureRequest.java b/android/src/main/java/com/taobao/power_image/request/PowerImageTextureRequest.java index ac6b1e0..a32e09f 100644 --- a/android/src/main/java/com/taobao/power_image/request/PowerImageTextureRequest.java +++ b/android/src/main/java/com/taobao/power_image/request/PowerImageTextureRequest.java @@ -3,9 +3,9 @@ import android.graphics.Rect; import android.view.Surface; +import com.taobao.power_image.PowerImageEngineContext; import com.taobao.power_image.dispatcher.PowerImageDispatcher; import com.taobao.power_image.loader.FlutterImage; -import com.taobao.power_image.loader.FlutterSingleFrameImage; import com.taobao.power_image.loader.PowerImageResult; import java.lang.ref.WeakReference; @@ -31,8 +31,8 @@ public class PowerImageTextureRequest extends PowerImageBaseRequest { private int bitmapWidth; private int bitmapHeight; - public PowerImageTextureRequest(Map arguments, TextureRegistry textureRegistry) { - super(arguments); + public PowerImageTextureRequest(PowerImageEngineContext context, Map arguments, TextureRegistry textureRegistry) { + super(context, arguments); textureRegistryWrf = new WeakReference<>(textureRegistry); stopped = false; } From d3e3b013be088eb855c25932e89d120ccfaa9acc Mon Sep 17 00:00:00 2001 From: YangJiakang Date: Sat, 19 Nov 2022 21:30:13 +0800 Subject: [PATCH 3/3] introduce PowerImageEngineContext for mutiengine. --- .../power_image/PowerImageEngineContext.java | 19 +++++++++++----- .../taobao/power_image/PowerImagePlugin.java | 22 +++++-------------- .../request/PowerImageBaseRequest.java | 6 ++--- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/android/src/main/java/com/taobao/power_image/PowerImageEngineContext.java b/android/src/main/java/com/taobao/power_image/PowerImageEngineContext.java index 21f9e2e..ae9ecd1 100644 --- a/android/src/main/java/com/taobao/power_image/PowerImageEngineContext.java +++ b/android/src/main/java/com/taobao/power_image/PowerImageEngineContext.java @@ -28,10 +28,12 @@ public class PowerImageEngineContext implements MethodChannel.MethodCallHandler private MethodChannel methodChannel; private EventChannel eventChannel; - public PowerImageEngineContext(FlutterPlugin.FlutterPluginBinding flutterPluginBinding) { + public PowerImageEngineContext() { powerImageRequestManager = new PowerImageRequestManager(this); powerImageEventSink = new PowerImageEventSink(); + } + public void onAttachedToEngine(@NonNull FlutterPlugin.FlutterPluginBinding flutterPluginBinding) { methodChannel = new MethodChannel( flutterPluginBinding.getBinaryMessenger(), "power_image/method"); methodChannel.setMethodCallHandler(this); @@ -58,8 +60,10 @@ public List> releaseRequestsWithArguments(List arguments) { return powerImageRequestManager.releaseRequestsWithArguments(arguments); } - public PowerImageEventSink getPowerImageEventSink() { - return powerImageEventSink; + public void sendImageStateEvent(Map event, boolean success) { + if (powerImageEventSink != null) { + powerImageEventSink.sendImageStateEvent(event, success); + } } @Override @@ -87,8 +91,12 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result } public void onDetached() { - methodChannel.setMethodCallHandler(null); - eventChannel.setStreamHandler(null); + if (methodChannel != null) { + methodChannel.setMethodCallHandler(null); + } + if (eventChannel != null) { + eventChannel.setStreamHandler(null); + } } public static class PowerImageEventSink implements EventChannel.StreamHandler { @@ -114,5 +122,4 @@ public void sendImageStateEvent(Map event, boolean success) { eventSink.success(event); } } - } diff --git a/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java b/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java index 0d845ef..ba83f94 100644 --- a/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java +++ b/android/src/main/java/com/taobao/power_image/PowerImagePlugin.java @@ -7,12 +7,7 @@ import com.taobao.power_image.dispatcher.PowerImageDispatcher; -import java.util.HashMap; -import java.util.Map; - import io.flutter.embedding.engine.plugins.FlutterPlugin; -import io.flutter.plugin.common.EventChannel; -import io.flutter.plugin.common.MethodChannel; /** * PowerImagePlugin @@ -20,7 +15,6 @@ public class PowerImagePlugin implements FlutterPlugin { private static Context sContext; - public static Map powerImageEngineContextMap = new HashMap<>(); public static Context getContext() { return sContext; @@ -30,29 +24,25 @@ public static Context getContext() { System.loadLibrary("powerimage"); } - private String engineId; + private PowerImageEngineContext engineContext; @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { if (sContext == null) { sContext = flutterPluginBinding.getApplicationContext(); } - PowerImageEngineContext engineContext = new PowerImageEngineContext(flutterPluginBinding); - engineId = String.valueOf(flutterPluginBinding.getFlutterEngine().hashCode()); - powerImageEngineContextMap.put(engineId, engineContext); + if (engineContext == null) { + engineContext = new PowerImageEngineContext(); + } + engineContext.onAttachedToEngine(flutterPluginBinding); PowerImageDispatcher.getInstance().prepare(); } @Override public void onDetachedFromEngine(FlutterPluginBinding binding) { - PowerImageEngineContext engineContext = getEngineContext(); if (engineContext != null) { engineContext.onDetached(); + engineContext = null; } - powerImageEngineContextMap.remove(engineId); - } - - public PowerImageEngineContext getEngineContext() { - return powerImageEngineContextMap.get(engineId); } } diff --git a/android/src/main/java/com/taobao/power_image/request/PowerImageBaseRequest.java b/android/src/main/java/com/taobao/power_image/request/PowerImageBaseRequest.java index f0adbcf..277f4f1 100644 --- a/android/src/main/java/com/taobao/power_image/request/PowerImageBaseRequest.java +++ b/android/src/main/java/com/taobao/power_image/request/PowerImageBaseRequest.java @@ -77,8 +77,7 @@ public void onLoadSuccess() { @Override public void run() { PowerImageBaseRequest.this.imageTaskState = REQUEST_STATE_LOAD_SUCCEED; - engineContext.getPowerImageEventSink() - .sendImageStateEvent(PowerImageBaseRequest.this.encode(), true); + engineContext.sendImageStateEvent(PowerImageBaseRequest.this.encode(), true); } }); } @@ -90,8 +89,7 @@ public void run() { PowerImageBaseRequest.this.imageTaskState = REQUEST_STATE_LOAD_FAILED; Map event = PowerImageBaseRequest.this.encode(); event.put("errMsg", errMsg != null ? errMsg : "failed!"); - engineContext.getPowerImageEventSink() - .sendImageStateEvent(event, false); + engineContext.sendImageStateEvent(event, false); } }); }