【问题标题】:Displaying progress dialog at the start of a GPS application在 GPS 应用程序启动时显示进度对话框
【发布时间】:2011-08-05 15:22:36
【问题描述】:
我正在开发一个应用程序,我希望在应用程序启动时(GPS 服务启动时)显示进度对话框。当 GPS 服务返回有效位置时,我想结束进度对话框。
我知道我必须开始另一个线程,但我不知道该怎么做。
我有:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, 10, this);
在我的onCreate().
public void onLocationChanged(Location location) 是更新数据的位置。
【问题讨论】:
标签:
android
multithreading
location
progressdialog
【解决方案1】:
我认为你遇到的真正问题是你不知道你什么时候会真正获得一个有效的位置,在这种情况下显示进度条将很难做到,因为你无法确定多远你也在。
我建议您向用户显示一条“正在获取 GPS 位置”的消息,并且可能会显示某种类型的动画,其中包括 GPS 卫星旋转、在 GPS 卫星和 GPS 接收器之间传输的“信号”或闪烁GPS 图标,表示您正在获取 GPS 信号(但要让它看起来更舒服):
因此,在您的 GUI 线程中,您将渲染动画,同时您将运行另一个线程来获取 GPS 信号。当您获取 GPS 信号时,您将终止渲染:
要启动新线程,请执行以下操作:
class GPSPositionGetter extends Runnable
{
private LocationManager _locationManager;
GPSPositionGetter(LocationManager locationManager)
public run()
{
_locationManager.requestLocationUpdates(...);
}
}
Thread t = new Thread(new GPSPositionGetter(locationManager));
t.start();
在您的 GUI 线程中:
while(!positionAcquired)
{
renderAnimation();
}
在你做的回调方法里面:
public onLocationChanged(Location location)
{
if(IsValid(location))
{
positionAcquired = true;
}
}
请注意,您应该将positionAcquired 声明为volatile,以确保可见性并防止它在线程的本地内存中兑现。
附:该代码只是为了让您大致了解该做什么;还有其他更优雅的解决方案(例如使用ExecutorService),但一般方法应该没有太大不同。