5

私は今BluetoothAndroidAPIを勉強していて、BluetoothChatの例に出くわしました。 http://developer.android.com/resources/samples/BluetoothChat/index.html

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

その他の興味深い点は、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が常に同じスレッドによって呼び出されることを知りませんでしたか?または私は何かが恋しいですか?

前もって感謝します!

4

1 に答える 1

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

ただし、これはサンプル アプリであるため、よりシンプルなものを使用することにした可能性があります。サンプル アプリは、例に必要な特定のコードを示すことを目的としているため、常に規則に従っているとは限りません。規則に従うと、多くの「気が散る」コードが追加される場合があります。それに同意するかどうかはあなた次第です。

于 2012-05-24T17:20:12.103 に答える