mrmaffen / vlc-android-sdk

VLC Android SDK pushed to Maven Central. Primarily used in project tomahawk-android.
792 stars 244 forks source link

Memory Leak in MediaPlayer.Event and VLCObject.EventRunnable #79

Open SaundersB opened 7 years ago

SaundersB commented 7 years ago

When implementing my own event listener for a media player, I found that the heap displays a massive amount of MediaPlayer.Events and VLCObject.EventRunnables. In some cases I see 3,000-8,000 instances of these events or event runnables.

There are two places I see this happening:

I'm using both vlc-android 2.0.6 and 2.1.2.

/* JNI */
    @SuppressWarnings("unused") /* Used from JNI */
    private long mInstance = 0;
    private synchronized void dispatchEventFromNative(int eventType, long arg1, float arg2) {
        if (isReleased())
            return;
        final T event = onEventNative(eventType, arg1, arg2);

        class EventRunnable implements Runnable {
            private final VLCEvent.Listener<T> listener;
            private final T event;

            private EventRunnable(VLCEvent.Listener<T> listener, T event) {
                this.listener = listener;
                this.event = event;
            }
            @Override
            public void run() {
                listener.onEvent(event);
            }
        }

        if (event != null && mEventListener != null && mHandler != null) {
            mHandler.post( new EventRunnable(mEventListener, event));
        }
    }
@SuppressWarnings("unchecked,unused") /* Used from JNI */
    private static void dispatchEventFromWeakNative(Object weak, int eventType, long arg1, float arg2) {
        VLCObject obj = ((WeakReference<VLCObject>)weak).get();
        if (obj != null) {
            obj.dispatchEventFromNative(eventType, arg1, arg2);
            obj.release();
        }
    }