2012-01-06 24 views
5

Tôi đang học ngay bây giờ API Android bluetooth, và tôi chạy vào ví dụ BluetoothChat. http://developer.android.com/resources/samples/BluetoothChat/index.htmlBluetoothChat được đồng bộ hóa trên phương pháp vòng đời hoạt độngResume, tại sao?

Có nhiều lỗi, trước hết là thực tế đơn giản là nó sử dụng API 11 nhưng tệp kê khai không ép buộc API tối thiểu này.

điều thú vị khác là việc sử dụng từ khóa synchronized về phương pháp vòng đời hoạt động, như trên 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(); 
     } 
    } 
} 

Tại sao từ khóa này được sử dụng đó? Có lời giải thích hợp lý nào hay chỉ đơn giản là người đã viết mã không biết rằng onResume sẽ luôn được gọi bởi cùng một luồng? Hoặc tôi bỏ lỡ một cái gì đó?

Cảm ơn bạn trước!

+0

Tôi thực sự muốn biết câu trả lời cho câu hỏi này cũng ... –

Trả lời

1

Điều này dường như là một câu hỏi khá cũ, nhưng đây là những gì tôi nghĩ có thể xảy ra:

tôi đoán là nó muốn phải cẩn thận khi "hộp thoại" trở lại. Ví dụ BluetoothChat sử dụng hộp thoại (cũng như hoạt động giống như hộp thoại lớp phủ) để bật Bluetooth, cho phép khám phá và bắt đầu ghép nối/kết nối.

Tôi không biết điều này chắc chắn nhưng tôi nghi ngờ có một lỗi mà các chủ đề khác nhau đã trở lại Hoạt động chính và gây nhầm lẫn về cách xử lý onResume.

Điều họ có thể đã làm là synchronize một khối trên đối tượng và cờ được sử dụng để xác định trạng thái. Bằng cách đó, ý định, trạng thái và chức năng rõ ràng hơn - và ứng dụng biết những gì nó nên làm trong onResume;

một cái gì đó giống như có lẽ đây:

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

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

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

Tuy nhiên, do nó là một ứng dụng Ví dụ, họ có thể đã quyết định đi với một cái gì đó đơn giản hơn. Ứng dụng mẫu không phải lúc nào cũng theo quy ước vì ý tưởng là để minh họa mã cụ thể cần thiết cho ví dụ. Đôi khi theo quy ước có thể thêm rất nhiều mã "mất tập trung". Dù bạn có đồng ý với điều đó tùy thuộc vào bạn hay không.

Các vấn đề liên quan