ネットワークプロバイダーを介して生成しているnullを取得した場合、最初にgpsプロバイダーを介して場所を生成しようとしています。私の問題は、ネットワーク プロバイダーが同じ場所を 2 回生成することです。情報をデータベースに送信すると、同じ時間 (同じ秒数) で同じ場所が送信されます。ここにいくつかのコードがあります:
gpsLocation = requestUpdatesFromProvider(LocationManager.GPS_PROVIDER, R.string.not_support_gps);
networkLocation = requestUpdatesFromProvider(LocationManager.NETWORK_PROVIDER, R.string.not_support_gps);
// Update the UI immediately if a location is obtained.
if (gpsLocation != null)
updateUILocation(gpsLocation);
else
updateUILocation(networkLocation);
requestUpdateFromProvider は次のとおりです。
private Location requestUpdatesFromProvider(final String provider, final int errorResId)
{
Location location = null;
if (mLocationManager.isProviderEnabled(provider))
{
mLocationManager.requestLocationUpdates(provider, TEN_SECONDS, TEN_METERS*2, listener);
location = mLocationManager.getLastKnownLocation(provider);
}
else
{
Toast.makeText(this, errorResId, Toast.LENGTH_LONG).show();
}
return location;
}
updateUILocation は次のとおりです。
private void updateUILocation(Location location)
{
// We're sending the update to a handler which then updates the UI with the new location.
Message.obtain(mHandler,
UPDATE_LATLNG,
location.getLatitude() + ", " + location.getLongitude()).sendToTarget();
// Bypass reverse-geocoding only if the Geocoder service is available on the device.
if (mGeocoderAvailable)
doReverseGeocoding(location);
}
ハンドラーは次のとおりです。
mHandler = new Handler()
{
public void handleMessage(Message msg)
{
if(msg.what == UPDATE_ADDRESS) //UPDATE_ADDRESS = 1
{
LocationService.this.address = (String) msg.obj; // update a string that show the user address
new SendLocation(LocationService.this.id,(String)msg.obj);//send the info to the db.
}
}
};
SendLocation は本来の動作を正しく行っているため、注意を払う必要はありません。
編集
コードの最初の部分は、コンストラクターから呼び出されるメソッドであることを忘れていました。