Имеется удаленный сервер, при подключении к нему с него грузится объект входа(объект и объект, не более и все тут), затем этому объекту можно будет послать метод входа, который войдет на удаленном сервере в аккаунт, соотв. ответ тоже приходит в другом потоке.
Получается, объект грузится в 1 потоке, метод входа вызывается в другом, ответ приходит в третьем. А нужно это ответ о результате собрать в 1 поток, в тот, в котором метод входа вызывался и вернуть ответ там же. ВАЖНО: Сервак может и не ответить, так что слушатели не вариант, да и вызыватся они будут в разных потоках..
Как я пытался делать:
Вариант 1, при помощи Semaphore.
Я сделал по 1 семафору для каждого события: объект загружен, есть ответ от сервера о входе, аккаунт загружен(итого = 3 семафора).
То есть схема в этом случае такая: Я захватываю первый семафор(метод входа), отправляю пакет на сервер и захватываю семафор, что ответ от сервера пришел, потом его проверяю и захватываю еще 1 семафор, что аккаунт(профиль) загружен.
Как-ой то костыль в общем.
Вариант 2 reentrantlock и condition.
Тут я создаю 1 лок для метода входа и 2 условия, первое - что пришел ответ от сервака, второе - акк загрузился.
private final Lock loginLock = new ReentrantLock(true);
private final Condition whenLoginResponse = loginLock.newCondition();
===========================
//Колбэк нужно вызвать в том же потоке, в котором вызывали doLogin.
public void doLogin(String login, String password, final LoginResultCallback callback) {
loginLock.lock();//локаем метод, чтобы другие потоки не могли вызвать метод входа. Верно же?
try {
... некоторые проверки, чтобы в акк уже не вошли ...
... отправка пакета ВХОДА на сервер ...
... ждем ответ с сервера...
whenLoginResponse.await(); <- Тут ничего не отпускает(дальше не идет),
почему-то ждет вечно, хотя whenLoginResponse.signal() был вызван 100%.
... логика проверок ответа от сервера (верный ли был пароль, логин, не в блоке
ли акк и т.д.) ...
... тут по аналогии с whenLoginResponse.await() нужно подождать загрузки профиля...
callback.onLoginOk(client); <- тут вызывается метод, что в акк зашло.
ИЛИ не зашло(не важно):
callback.onLoginFailed(client, LoginFailedCause.BLOCKED, null);
} finally {
loginLock.unlock();
}
}
Когда с сервера приходит ответ, то вызывается метод signal:
whenLoginResponse.signal();
Помогите советами и псевдо-кодом. Заранее спасибо!
UP: Еще раз,
нужно так, чтобы колбэк был вызван в том же потоке, который вызывал doLogin, при этом, чтобы пока идет процесс входа другие потоки НЕ могли вызывать doLogin параллельно..