Skip to content

Commit cba7767

Browse files
authored
Fix memory leak issue (#169)
* fixed dart deprecation warning added the missing async await to some platform methods * fix memory leak issues * added isDisposed var to android part * updated readme * updated readme * updated example code * fix android deprecated warning issue
1 parent 5e8a102 commit cba7767

File tree

12 files changed

+128
-181
lines changed

12 files changed

+128
-181
lines changed

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,11 @@ class _MyHomePageState extends State<MyHomePage> {
124124
}
125125
126126
@override
127-
void dispose() {
128-
_videoPlayerController.stopRendererScanning();
129-
_videoPlayerController.removeListener(() {});
127+
void dispose() async {
130128
super.dispose();
129+
_videoPlayerController.removeListener(() {});
130+
await _videoPlayerController.stopRendererScanning();
131+
await _videoViewController.dispose();
131132
}
132133
133134
@override

flutter_vlc_player/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ class _MyHomePageState extends State<MyHomePage> {
123123
}
124124
125125
@override
126-
void dispose() {
127-
_videoPlayerController.stopRendererScanning();
128-
_videoPlayerController.removeListener(() {});
126+
void dispose() async {
129127
super.dispose();
128+
await _videoPlayerController.stopRendererScanning();
129+
await _videoViewController.dispose();
130130
}
131131
132132
@override

flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayer.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,35 @@ final class FlutterVlcPlayer implements PlatformView {
5252
private MediaPlayer mediaPlayer;
5353
private List<RendererDiscoverer> rendererDiscoverers;
5454
private List<RendererItem> rendererItems;
55+
private boolean isDisposed = false;
5556

5657
// Platform view
5758
@Override
5859
public View getView() {
5960
return textureView;
6061
}
6162

63+
@Override
64+
public void dispose() {
65+
if (isDisposed)
66+
return;
67+
//
68+
textureEntry.release();
69+
mediaEventChannel.setStreamHandler(null);
70+
rendererEventChannel.setStreamHandler(null);
71+
if (mediaPlayer != null) {
72+
mediaPlayer.stop();
73+
mediaPlayer.getVLCVout().detachViews();
74+
mediaPlayer.release();
75+
mediaPlayer = null;
76+
}
77+
if (libVLC != null) {
78+
libVLC.release();
79+
libVLC = null;
80+
}
81+
isDisposed = true;
82+
}
83+
6284
// VLC Player
6385
FlutterVlcPlayer(int viewId, Context context, BinaryMessenger binaryMessenger, TextureRegistry textureRegistry) {
6486
this.context = context;
@@ -536,10 +558,12 @@ public void onEvent(RendererDiscoverer.Event event) {
536558
}
537559

538560
void stopRendererScanning() {
561+
if (isDisposed)
562+
return;
563+
//
539564
for (RendererDiscoverer rendererDiscoverer : rendererDiscoverers) {
540565
rendererDiscoverer.stop();
541566
rendererDiscoverer.setEventListener(null);
542-
543567
}
544568
rendererDiscoverers.clear();
545569
rendererItems.clear();
@@ -571,6 +595,9 @@ HashMap<String, String> getRendererDevices() {
571595
}
572596

573597
void castToRenderer(String rendererDevice) {
598+
if(isDisposed)
599+
return;
600+
//
574601
boolean isPlaying = mediaPlayer.isPlaying();
575602
if (isPlaying)
576603
mediaPlayer.pause();
@@ -596,19 +623,6 @@ String getSnapshot() {
596623
return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT);
597624
}
598625

599-
public void dispose() {
600-
textureEntry.release();
601-
mediaEventChannel.setStreamHandler(null);
602-
rendererEventChannel.setStreamHandler(null);
603-
if (mediaPlayer != null) {
604-
mediaPlayer.stop();
605-
mediaPlayer.getVLCVout().detachViews();
606-
mediaPlayer.release();
607-
}
608-
if (libVLC != null)
609-
libVLC.release();
610-
}
611-
612626
private void log(String message) {
613627
if (debug) {
614628
Log.d(TAG, message);

flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayerBuilder.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ public void create(Messages.CreateMessage arg) {
8282

8383
@Override
8484
public void dispose(Messages.TextureMessage arg) {
85-
FlutterVlcPlayer player = vlcPlayers.get(arg.getTextureId());
86-
player.dispose();
85+
// the player has been already disposed by platform we just remove it from players list
8786
vlcPlayers.remove(arg.getTextureId());
8887
}
8988

flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayerPlugin.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import io.flutter.embedding.engine.plugins.FlutterPlugin;
1010
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
1111
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
12-
import io.flutter.plugin.common.PluginRegistry;
13-
import io.flutter.view.FlutterNativeView;
1412

1513
public class FlutterVlcPlayerPlugin implements FlutterPlugin, ActivityAware {
1614

@@ -22,6 +20,7 @@ public class FlutterVlcPlayerPlugin implements FlutterPlugin, ActivityAware {
2220
public FlutterVlcPlayerPlugin() {
2321
}
2422

23+
@SuppressWarnings("deprecation")
2524
public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registrar registrar) {
2625
flutterVlcPlayerFactory =
2726
new FlutterVlcPlayerFactory(
@@ -36,12 +35,9 @@ public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registra
3635
VIEW_TYPE,
3736
flutterVlcPlayerFactory
3837
);
39-
registrar.addViewDestroyListener(new PluginRegistry.ViewDestroyListener() {
40-
@Override
41-
public boolean onViewDestroy(FlutterNativeView view) {
42-
stopListening();
43-
return false;
44-
}
38+
registrar.addViewDestroyListener(view -> {
39+
stopListening();
40+
return false;
4541
});
4642
//
4743
startListening();
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
12
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
23
#include "Generated.xcconfig"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
12
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
23
#include "Generated.xcconfig"

flutter_vlc_player/example/lib/multiple_tab.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ class _MultipleTabState extends State<MultipleTab> {
6464
}
6565

6666
@override
67-
void dispose() {
68-
for (var i = 0; i < controllers.length; i++) {
69-
controllers[i].stopRendererScanning();
70-
controllers[i].removeListener(() {});
71-
}
67+
void dispose() async {
7268
super.dispose();
69+
for (final controller in controllers) {
70+
await controller.stopRendererScanning();
71+
await controller.dispose();
72+
}
7373
}
7474
}

flutter_vlc_player/example/lib/single_tab.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class SingleTab extends StatefulWidget {
1818
class _SingleTabState extends State<SingleTab> {
1919
VlcPlayerController _controller;
2020
final _key = GlobalKey<VlcPlayerWithControlsState>();
21+
2122
//
2223
List<VideoData> listVideos;
2324
int selectedVideoIndex;
@@ -221,9 +222,9 @@ class _SingleTabState extends State<SingleTab> {
221222
}
222223

223224
@override
224-
void dispose() {
225-
_controller.stopRendererScanning();
226-
_controller.removeListener(() {});
225+
void dispose() async {
227226
super.dispose();
227+
await _controller.stopRendererScanning();
228+
await _controller.dispose();
228229
}
229230
}

0 commit comments

Comments
 (0)