Android Wifi定位
2010-08-23 01:31:00 来源:WEB开发网6.谁在监听变化(WIFI/基站)
NetworkLocationProvider在监听变化(WIFI/基站):
1 radio_data_provider_ = RadioDataProvider::Register(this); 2 wifi_data_provider_ = WifiDataProvider::Register(this);
当有变化时,会调用函数DeviceDataUpdateAvailable:
代码
// DeviceDataProviderInterface::ListenerInterface implementation.void NetworkLocationProvider::DeviceDataUpdateAvailable( RadioDataProvider *provider) { MutexLock lock(&data_mutex_); assert(provider == radio_data_provider_); is_radio_data_complete_ = radio_data_provider_->GetData(&radio_data_); DeviceDataUpdateAvailableImpl();} void NetworkLocationProvider::DeviceDataUpdateAvailable( WifiDataProvider *provider) { assert(provider == wifi_data_provider_); MutexLock lock(&data_mutex_); is_wifi_data_complete_ = wifi_data_provider_->GetData(&wifi_data_); DeviceDataUpdateAvailableImpl();}
无论是WIFI还是基站变化,最后都会调用 DeviceDataUpdateAvailableImpl:
1 void NetworkLocationProvider::DeviceDataUpdateAvailableImpl() {2 timestamp_ = GetCurrentTimeMillis();3 4 // Signal to the worker thread that new data is available.5 is_new_data_available_ = true;6 thread_notification_event_.Signal();7 }
这里面只是发了一个signal,通知另外一个线程去处理。
7.谁在等待thread_notification_event_
线程函数NetworkLocationProvider::Run在一个循环中等待 thread_notification_event,当有变化(WIFI/基站)时,就准备请求服务器查询位置。
先等待:
1 if (remaining_time > 0) {2 thread_notification_event_.WaitWithTimeout(3 static_cast(remaining_time));4 } else {5 thread_notification_event_.Wait();6 }
准备请求:
1 if (make_request) { 2 MakeRequest(); 3 remaining_time = 1; 4 }
再来看MakeRequest的实现:
先从cache中查找位置:
1 const Position *cached_position = 2
更多精彩
赞助商链接