MediaSessionManager: make the binder implementation static
Removing references to application resources on unregistering so that they
can be GCed as ealry as possible.
Bug: https://code.google.com/p/android/issues/detail?id=161398
Change-Id: Icc083f4a58bb5e738aa662247dc83d021a9dc5c3
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 6ac0efb..2364a13 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -202,7 +202,8 @@
Log.w(TAG, "Attempted to add session listener twice, ignoring.");
return;
}
- SessionsChangedWrapper wrapper = new SessionsChangedWrapper(sessionListener, handler);
+ SessionsChangedWrapper wrapper = new SessionsChangedWrapper(mContext, sessionListener,
+ handler);
try {
mService.addSessionsListener(wrapper.mStub, notificationListener, userId);
mListeners.put(sessionListener, wrapper);
@@ -229,6 +230,8 @@
mService.removeSessionsListener(wrapper.mStub);
} catch (RemoteException e) {
Log.e(TAG, "Error in removeOnActiveSessionsChangedListener.", e);
+ } finally {
+ wrapper.release();
}
}
}
@@ -317,11 +320,14 @@
public void onActiveSessionsChanged(@Nullable List<MediaController> controllers);
}
- private final class SessionsChangedWrapper {
- private final OnActiveSessionsChangedListener mListener;
- private final Handler mHandler;
+ private static final class SessionsChangedWrapper {
+ private Context mContext;
+ private OnActiveSessionsChangedListener mListener;
+ private Handler mHandler;
- public SessionsChangedWrapper(OnActiveSessionsChangedListener listener, Handler handler) {
+ public SessionsChangedWrapper(Context context, OnActiveSessionsChangedListener listener,
+ Handler handler) {
+ mContext = context;
mListener = listener;
mHandler = handler;
}
@@ -333,17 +339,25 @@
mHandler.post(new Runnable() {
@Override
public void run() {
- ArrayList<MediaController> controllers
- = new ArrayList<MediaController>();
- int size = tokens.size();
- for (int i = 0; i < size; i++) {
- controllers.add(new MediaController(mContext, tokens.get(i)));
+ if (mListener != null) {
+ ArrayList<MediaController> controllers
+ = new ArrayList<MediaController>();
+ int size = tokens.size();
+ for (int i = 0; i < size; i++) {
+ controllers.add(new MediaController(mContext, tokens.get(i)));
+ }
+ mListener.onActiveSessionsChanged(controllers);
}
- mListener.onActiveSessionsChanged(controllers);
}
});
}
}
};
+
+ private void release() {
+ mContext = null;
+ mListener = null;
+ mHandler = null;
+ }
}
}