2012-05-15 24 views
7

Tài liệu của getSystemService khuyên dùng không chia sẻ đối tượng dịch vụ giữa các ngữ cảnh khác nhau.Kết quả getSystemService (...) có được lưu trong bộ nhớ cache không?

Đối với một ngữ cảnh đơn, có thích hợp hơn để lưu bộ nhớ cache đối tượng dịch vụ bằng cách gán nó vào trường mẫu trong onCreate() hoặc nó sẽ được lấy tại thời điểm sử dụng không? Việc sử dụng thành ngữ là gì?

Trả lời

5

Vì việc giữ đối tượng dịch vụ hệ thống có rất ít chi phí liên tục, tôi khuyên bạn nên giữ nó trong một thành viên dữ liệu. Cho dù bạn nhận được một trong onCreate() hoặc lười biếng khởi tạo nó nếu/khi cần thiết là tùy thuộc vào bạn.

Lưu ý rằng sử dụng đối tượng dịch vụ hệ thống có thể có chi phí đáng kể. Giữ một ví dụ LocationManager là giá rẻ; sử dụng GPS (ví dụ: qua số requestLocationUpdates()) không phải là giá rẻ.

+0

Cảm ơn con trỏ rằng một số đối tượng dịch vụ tốn kém hơn những người khác. –

+0

Tại sao bạn đề xuất lưu trữ dịch vụ? Bạn có nghĩ rằng có rất nhiều chi phí để gọi 'getSystemService'? – Sam

+1

@Sam: "Bạn có nghĩ rằng có nhiều chi phí để gọi getSystemService không?" - nó có lẽ không lớn, nhưng nó có thể liên quan đến IPC. – CommonsWare

0

Tôi sắp hỏi như vậy. Dưới đây là cách tôi thực hiện - bên trong một dịch vụ (được kế thừa từ Ngữ cảnh)

private static volatile LocationManager lm; // not final - we need a context 

private LocationManager lm() { 
    LocationManager result = lm; 
    if (result == null) { 
     synchronized (LocationMonitor.class) { // my service 
      result = lm; 
      if (result == null) 
       result = lm = (LocationManager) 
        getSystemService(Context.LOCATION_SERVICE); 
     } 
    } 
    return result; 
} 
Các vấn đề liên quan