2012-12-06 32 views
5

Sau khi thực hiện dòng này:Android WifiManager Chủ đề không bao giờ tắt

WifiManager man = ((WifiManager) ctx.getSystemService(Context.WIFI_SERVICE)); 

Một chủ đề có nhãn "WifiManager" sẽ xuất hiện. Trong tập tin nguồn Java cho WifiService.java line 203:

HandlerThread wifiThread = new HandlerThread("WifiService"); 
wifiThread.start(); 
mWifiHandler = new WifiHandler(wifiThread.getLooper()); 

Vấn đề là, mỗi khi ứng dụng của chúng tôi được đóng lại và mở cửa trở lại nó tạo ra một chủ đề mới, chạy nó 5 lần và bạn có 5 chủ đề. Bạn không chắc chắn liệu có ngăn chặn nó không?

EDIT

Thay đổi để getApplicationContext để đảm bảo bối cảnh nó được truy cập là phù hợp và tất cả là tốt. Tôi vẫn nhận được một chuỗi có nhãn "WifiService", nhưng tôi chỉ nhận được một chuỗi trên nhiều lần chạy.

+1

Tôi cảm thấy vấn đề thực sự của bạn là bạn có một số vấn đề ngữ cảnh, vì vậy tôi sẽ không trả lời. Nhưng nếu bạn muốn hack theo cách của bạn thông qua vấn đề này bạn có thể tìm thấy chủ đề của bạn bằng cách [nhận] (http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in -java) một mảng các chủ đề từ ngăn xếp và sau đó tìm kiếm theo thread.getName() bằng 'WifiService' kể từ ThreadHandler mở rộng Thread. Sau đó, làm một cái gì đó như [this] (http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java). – shibbybird

+1

Ai sở hữu chủ đề bạn đang xem? Họ có cùng một người dùng và quá trình id như ứng dụng của bạn hoặc quá trình hệ thống? Bạn đang xem xét điều này trên một thiết bị cụ thể hoặc trong trình mô phỏng? Có "đóng cửa và mở cửa lại" có nghĩa là đi BACK/HOME và mở, hoặc Force Stopping quá trình? Nếu trước đây, điều gì sẽ xảy ra khi bạn làm việc sau? – Devunwired

+1

trông giống như một lỗi: http://code.google.com/p/android/issues/detail?id=43006 – user1159819

Trả lời

3

Tôi tin rằng bạn đang tạo một WifiManager mới trong khi bắt đầu/dừng lại (Context) Activity.

Một lưu ý từ Context.getSystemService()

Lưu ý: Dịch vụ hệ thống thu được thông qua API này có thể liên quan chặt chẽ với các bối cảnh mà chúng được lấy từ. ...

Cũng từ ContextImpl.java:1478:227

@Override 
public Object getSystemService(String name) { 
    ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); 
    return fetcher == null ? null : fetcher.getService(this); 
} 



... 
service = cache.get(mContextCacheIndex); 
if (service != null) { 
    return service; 
} 
... 

Nó sử dụng một bản đồ với các dịch vụ hệ thống bộ nhớ cache, vì vậy tôi tin rằng nếu bạn sử dụng bối cảnh tương tự như Application, bạn sẽ không chạy vào vấn đề này. Tôi không chắc chắn nếu điều này là đúng cách để giải quyết vấn đề này tuy nhiên, nếu có chủ đề đặt xung quanh một vấn đề lớn hơn cho bạn, nó có thể có giá trị trong khi.

+0

Tôi cảm thấy rằng bằng cách nào đó tôi nên đọc nó trước khi .... Tôi đang thử nó ngay bây giờ. Tôi tin rằng đó là những gì ShibbyBird đang nhận được, nhưng không xây dựng đủ xa cho bản thân dày đặc của tôi để có được. Sẽ sớm báo cáo lại. – accordionfolder

2

Khi bạn nhận được thể hiện của dịch vụ hệ thống bằng cách sử dụng Context.getSystemService(), bạn không gọi hàm tạo của dịch vụ. Thay vào đó, bạn đang thực sự nhận được một thể hiện của dịch vụ bằng cách sử dụng IBinder để thực hiện một cuộc gọi thủ tục từ xa trên đó. Vì vậy, các nhà xây dựng của WiFiService.java sẽ không được gọi mỗi khi bạn nhận được một thể hiện của nó. Trường hợp chính xác bạn thấy thread này bật lên?

+0

Mỗi khi chúng tôi thực hiện một chu kỳ khởi động/tắt máy hoàn toàn, chúng tôi sẽ nhận được một chuỗi "WifiManager" mới.Nếu bạn bước qua mã trên một thiết bị sau khi gọi hệ thống getystemservice, bạn sẽ thấy ngay một chủ đề mới bắt đầu. Tôi đã đào qua mã nguồn và tài liệu và (theo như những phần đó có liên quan), chúng tôi đang làm đúng "dọn dẹp". Nhưng chúng tôi nhận được một chủ đề mới cho mỗi chu kỳ bắt đầu/dừng lại mà không có cách nào để loại bỏ chúng. – accordionfolder

1

Tôi hy vọng ứng dụng của bạn là ứng dụng duy nhất đang truy cập WifiManager. Xin vui lòng kiểm tra cùng một lúc với một số ứng dụng giả mà truy cập WifiManager; trong trường hợp đó, nó không nên tạo một chủ đề mới.

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