编辑:我正在重写这个问题,因为我显然不清楚.
有时Android手机上的GPS服务需要很长时间才能得到修复.有时它很快,有时需要几个小时.我知道并接受这个.
我有一个做很多事情的应用程序.它必须做的一件事是允许用户单击按钮将其当前坐标发送到服务器.我需要的是当用户点击按钮时或在此后合理的短时间内手机的坐标.
因为我知道获得GPS修复不是即时的,我知道它可能需要几分钟或几小时(在此期间用户移动了很长的距离),我需要为此功能编写超时代码.对于此功能,在用户点击按钮后三分钟(例如)上传用户的GPS位置是不可接受的.如果它花了45秒就没关系,如果需要75秒则不行.如果功能无法足够快地获取位置,则可以向用户提供错误通知.
我需要一个功能'获取GPS位置并将其发送到服务器,除非它需要超过一分钟 '.
我的原始代码如下.自发布以来我已经改变了一些东西.我在onStartCommand()方法中添加了一个Timer.我启动一个TimerTask,60秒后会调用我的stop()方法.在onLocationChanged()方法的开头,我取消了TimerTask.
我的问题是:Timer方案是实现此超时的好方法吗?有没有更好的办法?
原始问题:
我正在编写一个Android应用程序,除其他外,需要在用户告知时将当前GPS坐标发送到服务器.从上下文菜单中,我运行以下服务.该服务是LocationListener并从LocationManager请求更新.当它获得一个位置(onLocationChanged())时,它将自己作为一个监听器删除并将坐标发送到服务器.所有这些都有效.
但是,如果GPS坐标不能快速获得,我的服务会一直运行直到它得到一些.它通过进度对话框来保持UI,这很烦人.更糟糕的是,如果用户自启动服务后已移动,则第一个GPS坐标可能是错误的,应用程序将向服务器发送错误数据.
我需要服务超时.有没有一个好方法呢?我对线程不太熟悉.我想我可以在onStartCommand()方法中运行Runnable,它会以某种方式倒计时30秒,然后,如果还没有GPS结果,则调用我的服务的stop()方法.这听起来像是最好的方法吗?
或者,是否可以判断GPS是否无法修复?我该怎么做呢?
编辑:为了进一步澄清,我正在寻找在一段时间后"放弃"获取位置的最佳方式.
public class AddCurrentLocation extends Service implements LocationListener {
Application app;
LocationManager mLocManager;
ProgressDialog mDialog;
@Override
public int onStartCommand(Intent intent, int arg0, int arg1) {
app = getApplication();
// show progress dialog
if (app.getScreen() != null) {
mDialog = ProgressDialog.show(app.getScreen(), "", "Adding Location. Please wait...", true);
}
// find GPS service and start listening
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String bestProvider = mLocManager.getBestProvider(criteria, true);
mLocManager.requestLocationUpdates(bestProvider, 2000, 0, this);
return START_NOT_STICKY;
}
private void stop() {
mLocManager.removeUpdates(this);
if (mDialog != null) {
mDialog.dismiss();
}
stopSelf();
}
@Override
public void onLocationChanged(Location location) {
// done with GPS stop listening
mLocManager.removeUpdates(this);
sendLocation(location); // method to send info to server
stop();
}
// other required methods and sendLocation() ...
}
Run Code Online (Sandbox Code Playgroud)
这不是真的如何运作.在大多数情况下,一直需要很长时间才能获得GPS定位.但是从每个更新的那一点开始(代码中每2秒)将是该人的当前位置.你获得的第一个修正将是该人的当前位置,因此数据不会"过时".
另一件事.如果您在服务中运行此代码,则不应使用进度对话框阻止UI,绝对不能通过服务阻止.那是等待发生的内存泄漏.您应该只显示进度,如果它最多可能需要5秒,并且正在活动中的一个线程中运行.另一个选项是在标题栏中显示进度对话框,并且仍然允许用户与应用程序交互(这就是您使用服务的原因).显示进展很长一段时间真的不是用户友好.特别是如果他们以某种方式改变方向(可能是意外)然后你的应用程序崩溃,因为对话框的服务句柄,他们必须重新开始.
查看Google I/O 2010应用程序,查看活动应如何与服务配合使用的一个很好的示例.它使用服务来提取数据,并在服务正在进行某些工作时显示标题的进度.并且仍然允许您在应用程序中执行其他操作.
| 归档时间: |
|
| 查看次数: |
21291 次 |
| 最近记录: |