Почти все примеры работы с удаленными сервисами содержат такой код (это один был взят из Google IabHelper)Каков правильный способ отключения удаленного сервера?
mServiceConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
logDebug("Billing service disconnected.");
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
logDebug("Billing service connected.");
mService = getServiceFromBinder(service);
...
}
};
Почему поле mService всегда устанавливается на нуль? Неправильно ли просто игнорировать обратный вызов onServiceConnected? По моему опыту пересоединение обычно происходит через 1-2 секунды. Google IABHelper даже не проверяет mService на нуль, несмотря на широко используемое поле, даже несколько асинхронных методов. И многие мои пользователи получают NPE в случае разъединения. Я хочу установить IabHelper. Вопрос в том, как ..
Что такое правильный способ справиться с disconnession, когда поле mService используется внутри асинхронных методов? Просто игнорируйте onServiceDisconnected и получите RemoteExceptions? Я подумал о подходе к уведомлению о ожиданиях, но нет гарантии, что произойдет пересоединение. Любые идеи приветствуются.
Спасибо за ваш ответ. Упомянутая проблема - моя собственная :) – akarimova
Но проверка нулевого значения в многопоточной среде - неправильный путь. В любом случае, благодарю Вас. – akarimova
В документации для ServiceConnection указано, что «Как и многие обратные вызовы из системы, методы этого класса вызываются из основного потока вашего процесса». Таким образом, проблемы многопоточного исполнения не должны применяться в этом случае. Объект ServiceConnection остается активным, и если и когда услуга будет восстановлена, будет вызван метод onServiceConnected(), и mService будет установлен в ненулевое значение, и вы будете готовы снова обрабатывать покупки. http://developer.android.com/reference/android/content/ServiceConnection.html – Carl