BluetoothChat синхронизирован по Resume Activity метод жизненного цикла, почему?
Я сейчас изучаю Bluetooth API для Android и столкнулся с примером BluetoothChat. http://developer.android.com/resources/samples/BluetoothChat/index.html
Он содержит много ошибок, прежде всего тот простой факт, что он использует API 11, но манифест не заставляет этот минимальный API.
Другая интересная вещь - это использование синхронизированного ключевого слова в методах жизненного цикла Activity, как в onResume:
@Override
public synchronized void onResume() {
super.onResume();
if(D) Log.e(TAG, "+ ON RESUME +");
// Performing this check in onResume() covers the case in which BT was
// not enabled during onStart(), so we were paused to enable it...
// onResume() will be called when ACTION_REQUEST_ENABLE activity returns.
if (mChatService != null) {
// Only if the state is STATE_NONE, do we know that we haven't started already
if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
// Start the Bluetooth chat services
mChatService.start();
}
}
}
Почему это ключевое слово используется там? Есть ли разумное объяснение, или просто тот, кто написал код, не знал, что onResume будет вызываться всегда одним и тем же потоком? Или я что-то пропустил?
Заранее спасибо!
1 ответ
Кажется, это довольно старый вопрос, но я думаю, что вот что происходит:
Я предполагаю, что он хочет быть осторожным, когда возвращаются "диалоги". В примере BluetoothChat используются диалоговые окна (а также действия, похожие на диалоговые окна с наложением) для включения Bluetooth, включения обнаружения и инициирования сопряжения / соединений.
Я не знаю этого точно, но я подозреваю, что была ошибка, когда разные потоки возвращались к основному действию и вызывали путаницу относительно того, как обрабатывать onResume
,
Что они, вероятно, должны были сделать, так это synchronize
блок на объекте и использовать флаги для определения состояния. Таким образом, намерение, состояние и функциональность более понятны - и приложение знает, что оно должно делать в onResume
;
что-то вроде этого может быть:
//class fields
private Object myLockObj = new Object();
private boolean isPausedForPairing = false;
public void onResume()
{
super.onResume();
synchronized (myLockObj)
{
if (isPausedForPairing)
{
//handle a "pairing" onResume
}
}
}
Однако из-за того, что это пример приложения, они, возможно, решили пойти с чем-то более простым. Примеры приложений не всегда следуют соглашению, потому что идея состоит в том, чтобы продемонстрировать конкретный код, необходимый для примера. Иногда следующее соглашение может добавить много "отвлекающего" кода. Согласны ли вы с этим, зависит только от вас.