我正在研究蓝牙Android API,我遇到了蓝牙的例子。 http://developer.android.com/resources/samples/BluetoothChat/index.html
它包含许多错误,首先是它使用API 11的简单事实,但清单不强制使用此最小API。
其他有趣的事情是在Activity生命周期方法上使用synchronized关键字,例如on 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将始终由同一个线程调用?或者我错过了什么?
提前谢谢!
答案 0 :(得分:1)
这似乎是一个非常古老的问题,但这是我认为可能会发生的事情:
我的猜测是,它希望在“对话框”返回时要小心。 BluetoothChat示例使用对话框(以及类似覆盖对话框的活动)来启用蓝牙,启用发现和启动配对/连接。
我肯定不知道这一点,但我怀疑有一个错误,其中不同的线程返回到主Activity,并导致混淆如何处理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
}
}
}
然而,由于它是一个示例应用程序,他们可能已决定采用更简单的方式。示例应用程序并不总是遵循约定,因为其目的是演示示例所需的特定代码。有时遵循惯例可能会添加许多“分散注意力”的代码。不管你是否同意,都取决于你。