使用服务中的地理位置更新活动时的时序问题(使用共享首选项将地理位置从服务传输到活动)
Posted
技术标签:
【中文标题】使用服务中的地理位置更新活动时的时序问题(使用共享首选项将地理位置从服务传输到活动)【英文标题】:Timing problem when updating Activity with Geoposition from a Service (using Shared Preferences to transmit the geoposition from Service to Activity) 【发布时间】:2010-11-27 15:06:00 【问题描述】:在我的应用中,一个 Activity 启动一个服务。 Service 在其 onLocatioChanged 方法中获取基于网络的地理位置,并将其写入 Shared Preferences。然后调用自己的stopSelf();方法。 回到我的 Activity,我再次从 Shared Prefs 中读取了地理位置。
我的代码确实有效,唯一的问题是我的 Activity 从共享首选项中读取的地理位置始终来自服务的 privious 启动。 服务需要几毫秒来获取地理位置——在这段时间内,活动已经读取了过时的(以前的)地理位置。 我搜索了论坛,尝试在新线程中启动 Servive,并使用 Thread.sleep() 在活动线程中引入等待时间。到目前为止没有任何效果。
从我的活动中启动GeoServce.class的相关代码,并阅读Shared Prefs:
btnGeoPos.setOnLongClickListener (new View.OnLongClickListener()
public boolean onLongClick(View v)
startService(new Intent(getApplicationContext(), GeoService.class));
SharedPreferences mPrefs = getApplicationContext().getSharedPreferences("CurrentLoc", MODE_PRIVATE);
DisplayLoc = mPrefs.getString("LocationTransfer", "not available");
Toast.makeText(getApplicationContext()," GeoService retrieved: "+DisplayLoc, Toast.LENGTH_LONG).show();
return true; //LongClick was consumed
);
这是我将地理位置写入 SharedPrefs 的服务类,它本身工作正常:
public class GeoService extends Service
Location location = null;
LocationManager lm;
LocationListener ll;
@Override
public IBinder onBind(Intent intent)
// TODO Auto-generated method stub
return null;
public void onCreate()
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ll = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1,1000, ll);
public void onStart(Intent intent, int startiD)
private class MyLocationListener implements LocationListener
public void onLocationChanged(Location location)
String message = String.format("Current Location \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(), location.getLatitude());
Toast.makeText(GeoService.this, message, Toast.LENGTH_LONG).show();
SharedPreferences mPrefs = GeoService.this.getSharedPreferences("CurrentLoc", MODE_PRIVATE);
SharedPreferences.Editor editor1 = mPrefs.edit();
editor1.putString("LocationTransfer", message); // LocationTransfer is the key, message is the content passed
editor1.commit();
lm.removeUpdates(ll);
stopSelf();
public void onStatusChanged(String s, int i, Bundle b)
public void onProviderDisabled(String s)
Toast.makeText(GeoService.this,"Network Location turned off",Toast.LENGTH_LONG).show();
public void onProviderEnabled(String s)
// End inner class
// End Class
这个障碍让我数周以来一直在寻找,如果有任何帮助,我将不胜感激, 谢谢大家!
【问题讨论】:
【参考方案1】:您有多种选择:
让您接近异步:让服务在完成时通知 Activity。您可以使用BroadcastReceiver
来实现此目的。
如果此服务是短暂的并且仅由您的活动在内部使用,那么您不需要服务。请改用AsyncTask
。
【讨论】:
以上是关于使用服务中的地理位置更新活动时的时序问题(使用共享首选项将地理位置从服务传输到活动)的主要内容,如果未能解决你的问题,请参考以下文章