2012-01-06 6 views
5

私は今、BluetoothのAndroid APIを勉強しています.BluetoothChatの例を調べました。 http://developer.android.com/resources/samples/BluetoothChat/index.htmlBluetoothChatはonResumeアクティビティのライフサイクルメソッドを同期しました。なぜですか?

これには多くのエラーが含まれています。まず、API 11を使用するという単純な事実がありますが、マニフェストはこの最小限のAPIを強制しません。

その他興味深いのは、onResume上のように、活動のライフサイクルメソッドにsynchronizedキーワードの使用である:

@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の例では、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 
     } 
    } 
} 

、彼らはよりシンプルなものに行くことにしている場合があります。アプリケーションの例は、例のために必要な特定のコードを示すアイデアなので、必ずしも規約に従うとは限りません。場合によっては、大会の後に「気を散らす」コードがたくさん追加されることがあります。それに同意するかどうかはあなた次第です。

関連する問題