В моем классе есть метод подключения к сокету, который должен вызываться только одним потоком за раз.Внутри этого синхронизированного метода у меня есть синхронизированный блок, основанный на случайном объекте.Я вызываю синхронизированный метод подключения моего класса из службы Android
Проблема: Иногда приложение переходит в не отвечающее состояние, если для установления соединения socketIO требуется больше времени когда URL сокета недоступен .Я понятия не имею, почему это происходит.
class MyService extends Service {
public void onStartCommand() {
MyUtilClass.getInstance().init();
MyUtilClass.getInstance().startSomeOSBroadcastListeners();
MyUtilClass.getInstance().connectAsync();
}
}
class MyUtilClass {
private final Object tempObj = new Object();
private MyUtilClass mUtilClass;
public static MyUtilClass getInstance() {
if(mUtilClass == null)
mUtilClass = new MyUtilClass();
return mUtilClass;
}
public void init() {
startListeningSocketIoConnectEvent();
}
public MyUtilClass connectAsync() {
new Thread(new Runnable() {
connect();
}).start();
return this;
}
private synchronized MyUtilClass connect() {
synchronized(tempObj) {
mSocketIO.connect();
tempObject.wait();
}
return this;
}
private void startListeningSocketIoConnectEvent() {
mSocketIO.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
synchronized (mWaitLock) {
tempObj.notifyAll(); //releasing the lock
}
}
});
}
}
tempObj
используется только для фазы соединения socketIO, после чего он не используется.
Почему он иногда переходит в состояние ANR?Это правильная реализация?