2012-01-06 68 views
5

我正在研究藍牙Android API,並且我遇到了BluetoothChat示例。 http://developer.android.com/resources/samples/BluetoothChat/index.htmlBluetoothChat同步onResume Activity生命週期方法,爲什麼?

它包含許多錯誤,首先它使用API​​ 11但清單並不強制這個最小API的簡單事實。

其他有趣的事情是在活動生命週期方法的使用synchronized關鍵字,像的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

我真的很想知道這個問題的答案以及... – 2012-02-04 18:53:17

回答

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 
     } 
    } 
} 

然而,由於它是一個示例應用程序,他們可能已經決定去與一些更簡單。示例應用程序並不總是遵循慣例,因爲這個想法是爲了演示示例所需的特定代碼。有時遵循慣例可能會增加很多「分散注意力」的代碼。不管你是否同意這一點取決於你。

相關問題