编辑:我正在重写这个问题,因为我显然不清楚。
有时,Android 手机上的 GPS 服务需要很长时间才能修复。有时它很快,有时需要几个小时。我知道并接受这一点。
我有一个可以做很多事情的应用程序。它必须做的一件事是允许用户单击按钮将他们当前的坐标发送到服务器。我需要的是手机的坐标当用户点击按钮时或之后相当短的时间内。
因为我知道获取 GPS 定位不是即时的,而且我知道这可能需要几分钟或几小时(在此期间用户移动了很远的距离),所以我需要为此功能编写超时代码。对于此功能,在用户单击按钮后三分钟(例如)上传用户的 GPS 位置是根本不能接受的。如果需要 45 秒就可以,如果需要 75 秒就不行了。如果该功能未能足够快地获取位置,则可以向用户发出错误通知。
我需要一个功能来“获取 GPS 位置并将其发送到服务器,除非它花费超过一分钟”。
我的原始代码如下。自发布以来我已经改变了一些东西。我在 onStartCommand() 方法中添加了一个计时器。我启动了一个 TimerTask,它会在 60 秒后调用我的 stop() 方法。在 onLocationChanged() 方法开始时,我取消了 TimerTask。
我的问题是:计时器方案是实现此超时的好方法吗?有没有更好的办法?
原始问题:
我正在编写一个 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() ...
}
最佳答案
实际情况并非如此。在大多数情况下,获取 GPS 定位始终需要那么长时间。但从那时起,每次更新(代码中每 2 秒)将是此人的当前位置。您得到的第一个修复将是此人的当前位置,因此数据不会“过时”。
还有一点。如果您在服务中运行此代码,则不应使用进度对话框阻止 UI,绝对不要从服务中阻止。那是等待发生的内存泄漏。如果进度最多可能需要 5 秒,并且在 Activity 的线程中运行,则您应该只显示进度。另一种选择是在标题栏中显示进度对话框,并且仍然让用户与应用程序交互(这就是您无论如何都要使用服务的原因)。长时间显示进度确实不是用户友好的。特别是如果它们以某种方式改变方向(可能是意外),然后您的应用程序由于对话框的服务句柄而崩溃并且它们必须重新开始。
看看 Google I/O 2010 app查看 Activity 应如何与服务配合使用的一个很好的示例。它使用一个服务来拉回数据,并在服务做一些工作时在标题中显示进度。并且仍然允许您在应用程序中执行其他操作。
关于安卓 GPS 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2992567/
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p
在Ruby中,我需要在n毫秒秒后暂停一段代码的执行。我知道RubyTimeout库支持秒的超时:http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/index.html这可能吗? 最佳答案 只需为超时使用十进制值。n毫秒的示例:Timeout::timeout(n/1000.0){sleep(100)} 关于Ruby在n*milli*秒后超时一段代码,我们在StackOverflow上找到一个类似的问题: https:
我想知道从我的应用程序跟踪unicorn超时的最佳方法是什么。该应用程序的某些部分运行缓慢,目前它们已安静地超时。我可以增加超时时间,但这将问题推到了地毯下。理想情况下,我希望收到减速板通知或类似的效果。我不是在寻找性能指南,我只是在寻找一种高效可靠地了解超时的方法。其他人如何使用unicorn处理Rails应用程序的超时?扫描nginx错误日志?在unicorn配置中插入处理程序?nginx配置中的处理程序?[Ubuntu12.04+nginx+unicorn+rails3.2+ruby1.9.3] 最佳答案 我倾向于在NewRe
我正在使用rest-client发布到一个非常慢的网络服务。我将timeout设置为600秒,并且我已经确认它正在传递给Net::HTTP的@read_timeout和@open_timeout.但是,大约两分钟后,我收到一个低级超时错误,Errno::ETIMEDOUT:Connectiontimedout-connect(2):回溯的相关部分是Operationtimedout-connect(2)for[myhost]port[myport]/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in
我遇到了sidekiq的问题:我想为作业设置超时,这意味着当作业的处理时间大于超时时,该作业将停止。我已经搜索了如何在文件sidekiq.yml中设置全局超时配置。但是我想为不同的单独作业设置单独的超时,这意味着定义工作人员的类之一将具有特定的超时配置。你能帮帮我吗?非常感谢。 最佳答案 没有批准的方法可以做到这一点。您无法在线程执行时安全地停止它。您需要更改工作以定期检查它是否应该停止。您可以为您正在进行的任何第3方调用设置网络超时,以便它们超时。 关于ruby-on-rails-如何
自从我开始开发测试以来,我一直收到超时错误。起初我认为这与我的xpaths的效率有关,但在多次看到测试快速通过后,我认为这与选择器无关。该错误是随机发生的,并且通常在一个特征中多次发生。我需要修复或至少了解这个问题是什么。步骤定义示例:When/^Inavigateto"(.*)"$/do|webpage|navigate_to(webpage)end这是我得到的错误:Timeout::Error(Timeout::Error)/usr/lib/ruby/1.9.1/net/protocol.rb:146:in`rescueinrbuf_fill'/usr/lib/ruby/1.9.1
我想在不使用超时模块的情况下在Controller的操作中实现以下行为:classAdminController我想避免使用超时,因为它会在我的应用程序中导致许多错误,包括数据库连接泄漏。报告的其他一些问题:http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/ 最佳答案 不要为此使用ruby。问题是超时模块将在执行代码的任何地方中止代码,这将导致打开和悬空的套接字、连接和文件或更糟。(我想,如果你启动外部脚本或为每项工作支付费用,这并不是真正的问
我有一个Mechanize功能可以让我退出网站,但在极少数情况下它会让我超时。该功能涉及转到特定页面,然后单击注销按钮。有时,当进入注销页面或单击注销按钮时,mechanize会遇到超时,代码会崩溃。所以我做了一个小的救援,它似乎在第一段代码下面看到的那样工作。deflogmeout(agent)page=agent.get('http://www.example.com/')agent.click(page.link_with(:text=>/LogOut/i))end通过救援注销:deflogmeout(agent)beginpage=agent.get('http://www.e