Gears Android WIFI/基站定位源代码分析
2010-03-18 16:11:00 来源:WEB开发网// 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:
void NetworkLocationProvider::DeviceDataUpdateAvailableImpl() {
timestamp_ = GetCurrentTimeMillis();
// Signal to the worker thread that new data is available.
is_new_data_available_ = true;
thread_notification_event_.Signal();
}
这里面只是发了一个signal,通知另外一个线程去处理。
7.谁在等待thread_notification_event_
线程函数NetworkLocationProvider::Run在一个循环中等待thread_notification_event,当有变化 (WIFI/基站)时,就准备请求服务器查询位置。
先等待:
if (remaining_time > 0) {
thread_notification_event_.WaitWithTimeout(
static_cast
} else {
thread_notification_event_.Wait();
}
准备请求:
if (make_request) {
MakeRequest();
remaining_time = 1;
}
再来看MakeRequest的实现:
先从cache中查找位置:
const Position *cached_position =
position_cache_->FindPosition(radio_data_, wifi_data_);
更多精彩
赞助商链接