2012-01-06 9 views
5

Obecnie studiuję interfejs Bluetooth Android Bluetooth, a ja natknąłem się na przykład BluetoothChat. http://developer.android.com/resources/samples/BluetoothChat/index.htmlBluetoothChat zsynchronizowany onResume Metoda cyklu życia aktywności, dlaczego?

Zawiera wiele błędów, przede wszystkim prosty fakt, że używa interfejsu API 11, ale manifest nie wymusza tego minimalnego interfejsu API.

Inne Ciekawostką jest użycie zsynchronizowanego hasła na metodach cyklu życia działalności, jak na 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(); 
     } 
    } 
} 

Dlaczego ten parametr jest używany tam? Czy istnieje jakieś uzasadnione wytłumaczenie, czy po prostu ten, kto napisał kod, nie wiedział, że onResume będzie nazywane zawsze tą samą nitką? A może coś mi brakuje?

Z góry dziękuję!

+0

Naprawdę chciałbym poznać odpowiedź na to pytanie, jak również ... –

Odpowiedz

1

To wydaje się być dość stare pytanie, ale tutaj jest to, co myślę, że mogą być dzieje:

Domyślam się, że chce być ostrożnym, gdy „dialogi” w zamian. Przykład BluetoothChat wykorzystuje okna dialogowe (jak również nakładające się okno dialogowe) do włączania Bluetooth, umożliwiając wykrywanie i inicjowanie parowania/połączeń.

Nie wiem tego na pewno, ale podejrzewam, że był błąd, w którym różne wątki wracały do ​​głównej aktywności i powodowały zamieszanie związane z obsługą onResume.

To, co prawdopodobnie powinni byli zrobić, to synchronize blok obiektu i użyte flagi do określenia stanu. W ten sposób intencje, stan i funkcjonalność są bardziej jasne - a aplikacja wie, co należy zrobić w onResume;

coś takiego może:

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

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

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

jednak spowodowane to jest przykładem aplikacji, mogą one zdecydowały się iść z czymś bardziej prostego. Przykładowe aplikacje nie zawsze są zgodne z konwencją, ponieważ chodzi o pokazanie konkretnego kodu potrzebnego dla przykładu. Czasami następujące konwencje mogą dodać wiele "rozpraszającego" kodu. Niezależnie od tego, czy zgadzasz się z tym, zależy to od Ciebie.

Powiązane problemy