我正在开发一个应用程序,我希望在应用程序启动时(GPS服务启动时)显示进度对话框。我想在GPS服务返回有效位置时结束进度对话框。 我知道我必须开始另一个线程,但我不知道该怎么做。 我有:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, 10, this);
在我的onCreate()
。
public void onLocationChanged(Location location)
是数据更新的地方。
答案 0 :(得分: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
,以确保可见性并防止其在线程的本地内存中兑现。
P.S。代码只是为了让你大致了解该做什么;还有其他更优雅的解决方案(例如使用ExecutorService
),但一般方法应该没有太大的不同。