2012-01-06 24 views
5

Şu anda bluetooth Android API'sinde çalışıyorum ve BluetoothChat örneğine rastladım. http://developer.android.com/resources/samples/BluetoothChat/index.htmlBluetoothChat, Etkinlik Yaşam Döngüsü yaşam döngüsü yönteminde senkronize edildi, neden?

Bu, ilk başta API 11'i kullanan basit bir gerçektir, ancak bu minimum API'yi zorlama zorunluluğu yoktur.

Diğer ilginç şey onResume olduğu gibi, Etkinlik yaşam döngüsü yöntemleri senkronize anahtar kelimenin kullanılmasıdır:

@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(); 
     } 
    } 
} 

bu anahtar kelimenin orada neden kullanılmıştır? Herhangi bir makul açıklama var mı, yoksa sadece kodu yazan kişi, onResume'nin her zaman aynı iş parçacığı tarafından çağrılacağını bilmiyor muydu? Ya da bir şey özlüyorum?

şimdiden teşekkür ederiz!

+0

Bu sorunun cevabını gerçekten bilmek isterim. –

cevap

1

Bu oldukça eski bir soru gibi görünüyor, ama burada neler olabilir bence var:

Benim tahminim zaman "diyaloglar" dönüşü konusunda dikkatli olmak istemesi. BluetoothChat örneği, Bluetooth'u etkinleştirmek, keşfetmeyi etkinleştirmek ve eşleştirmeyi/bağlantıları başlatmak için iletişim kutuları (yanı sıra bir iletişim kutusu benzeri etkinlik) kullanır.

Bundan emin değilim ama farklı iş parçacıklarının ana etkinliğe döndüğü ve onResume'un nasıl ele alınacağı konusunda kafa karışıklığına neden olan bir hata olduğundan şüpheleniyorum.

Muhtemelen yapmaları gereken bir nesne üzerinde bir blok ve durumları belirlemek için kullanılan bayraklar synchronize olduğunu. Bu şekilde niyet, durum ve işlevsellik daha açık - ve uygulama onResume; Bu belki gibi

şey:

//class fields  
private Object myLockObj = new Object(); 
private boolean isPausedForPairing = false; 

public void onResume() 
{ 
    super.onResume(); 

    synchronized (myLockObj) 
    { 
     if (isPausedForPairing) 
     { 
      //handle a "pairing" onResume 
     } 
    } 
} 

Ancak, örnek bir uygulama olması nedeniyle, daha basit bir şey ile gitmek için karar vermiş olabilir. Örnek uygulamalar her zaman konvansiyona uymaz çünkü fikir, örnek için gerekli olan özel kodu göstermektir. Bazen aşağıdaki kurallar çok fazla "dikkat dağıtıcı" kod ekleyebilir. Bununla aynı fikirde olup olmamanız size kalmış.

İlgili konular