Синхронизированный блок внутри синхронизированного метода - PullRequest
0 голосов
/ 19 сентября 2019

В моем классе есть метод подключения к сокету, который должен вызываться только одним потоком за раз.Внутри этого синхронизированного метода у меня есть синхронизированный блок, основанный на случайном объекте.Я вызываю синхронизированный метод подключения моего класса из службы 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?Это правильная реализация?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...