Merge "Fix a memory leak of a Binder in SpellCheckerService" into ics-mr1

This commit is contained in:
satok
2011-11-03 02:09:32 -07:00
committed by Android (Google) Code Review
4 changed files with 44 additions and 1 deletions

View File

@ -145,6 +145,14 @@ public abstract class SpellCheckerService extends Service {
*/
public void onCancel() {}
/**
* Request to close this session.
* This function will run on the incoming IPC thread.
* So, this is not called on the main thread,
* but will be called in series on another thread.
*/
public void onClose() {}
/**
* @return Locale for this session
*/
@ -162,7 +170,7 @@ public abstract class SpellCheckerService extends Service {
// Preventing from exposing ISpellCheckerSession.aidl, create an internal class.
private static class InternalISpellCheckerSession extends ISpellCheckerSession.Stub {
private final ISpellCheckerSessionListener mListener;
private ISpellCheckerSessionListener mListener;
private final Session mSession;
private final String mLocale;
private final Bundle mBundle;
@ -192,6 +200,12 @@ public abstract class SpellCheckerService extends Service {
mSession.onCancel();
}
@Override
public void onClose() {
mSession.onClose();
mListener = null;
}
public String getLocale() {
return mLocale;
}

View File

@ -152,6 +152,7 @@ public class SpellCheckerSession {
public void close() {
mIsUsed = false;
try {
mSpellCheckerSessionListenerImpl.close();
mTextServicesManager.finishSpellCheckerService(mSpellCheckerSessionListenerImpl);
} catch (RemoteException e) {
// do nothing
@ -190,6 +191,7 @@ public class SpellCheckerSession {
private static class SpellCheckerSessionListenerImpl extends ISpellCheckerSessionListener.Stub {
private static final int TASK_CANCEL = 1;
private static final int TASK_GET_SUGGESTIONS_MULTIPLE = 2;
private static final int TASK_CLOSE = 3;
private final Queue<SpellCheckerParams> mPendingTasks =
new LinkedList<SpellCheckerParams>();
private final Handler mHandler;
@ -224,6 +226,9 @@ public class SpellCheckerSession {
case TASK_GET_SUGGESTIONS_MULTIPLE:
processGetSuggestionsMultiple(scp);
break;
case TASK_CLOSE:
processClose();
break;
}
}
@ -247,6 +252,13 @@ public class SpellCheckerSession {
suggestionsLimit, sequentialWords));
}
public void close() {
if (DBG) {
Log.w(TAG, "close");
}
processOrEnqueueTask(new SpellCheckerParams(TASK_CLOSE, null, 0, false));
}
public boolean isDisconnected() {
return mOpened && mISpellCheckerSession == null;
}
@ -284,6 +296,21 @@ public class SpellCheckerSession {
}
}
private void processClose() {
if (!checkOpenConnection()) {
return;
}
if (DBG) {
Log.w(TAG, "Close spell checker tasks.");
}
try {
mISpellCheckerSession.onClose();
mISpellCheckerSession = null;
} catch (RemoteException e) {
Log.e(TAG, "Failed to close " + e);
}
}
private void processGetSuggestionsMultiple(SpellCheckerParams scp) {
if (!checkOpenConnection()) {
return;