am ae309489: Merge "Fix race in RecognizerService teardown." into lmp-dev
* commit 'ae309489c2b22c6cfcc6701b5dea13c652239ecd': Fix race in RecognizerService teardown.
This commit is contained in:
@@ -28,6 +28,8 @@ import android.os.Message;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class provides a base class for recognition service implementations. This class should be
|
* This class provides a base class for recognition service implementations. This class should be
|
||||||
* extended only in case you wish to implement a new speech recognizer. Please note that the
|
* extended only in case you wish to implement a new speech recognizer. Please note that the
|
||||||
@@ -315,40 +317,46 @@ public abstract class RecognitionService extends Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Binder of the recognition service */
|
/** Binder of the recognition service */
|
||||||
private static class RecognitionServiceBinder extends IRecognitionService.Stub {
|
private static final class RecognitionServiceBinder extends IRecognitionService.Stub {
|
||||||
private RecognitionService mInternalService;
|
private final WeakReference<RecognitionService> mServiceRef;
|
||||||
|
|
||||||
public RecognitionServiceBinder(RecognitionService service) {
|
public RecognitionServiceBinder(RecognitionService service) {
|
||||||
mInternalService = service;
|
mServiceRef = new WeakReference<RecognitionService>(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void startListening(Intent recognizerIntent, IRecognitionListener listener) {
|
public void startListening(Intent recognizerIntent, IRecognitionListener listener) {
|
||||||
if (DBG) Log.d(TAG, "startListening called by:" + listener.asBinder());
|
if (DBG) Log.d(TAG, "startListening called by:" + listener.asBinder());
|
||||||
if (mInternalService != null && mInternalService.checkPermissions(listener)) {
|
final RecognitionService service = mServiceRef.get();
|
||||||
mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler,
|
if (service != null && service.checkPermissions(listener)) {
|
||||||
MSG_START_LISTENING, mInternalService.new StartListeningArgs(
|
service.mHandler.sendMessage(Message.obtain(service.mHandler,
|
||||||
|
MSG_START_LISTENING, service.new StartListeningArgs(
|
||||||
recognizerIntent, listener)));
|
recognizerIntent, listener)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void stopListening(IRecognitionListener listener) {
|
public void stopListening(IRecognitionListener listener) {
|
||||||
if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder());
|
if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder());
|
||||||
if (mInternalService != null && mInternalService.checkPermissions(listener)) {
|
final RecognitionService service = mServiceRef.get();
|
||||||
mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler,
|
if (service != null && service.checkPermissions(listener)) {
|
||||||
|
service.mHandler.sendMessage(Message.obtain(service.mHandler,
|
||||||
MSG_STOP_LISTENING, listener));
|
MSG_STOP_LISTENING, listener));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void cancel(IRecognitionListener listener) {
|
public void cancel(IRecognitionListener listener) {
|
||||||
if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder());
|
if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder());
|
||||||
if (mInternalService != null && mInternalService.checkPermissions(listener)) {
|
final RecognitionService service = mServiceRef.get();
|
||||||
mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler,
|
if (service != null && service.checkPermissions(listener)) {
|
||||||
|
service.mHandler.sendMessage(Message.obtain(service.mHandler,
|
||||||
MSG_CANCEL, listener));
|
MSG_CANCEL, listener));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearReference() {
|
public void clearReference() {
|
||||||
mInternalService = null;
|
mServiceRef.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user