我一直在开发应用程序,我需要获取设备的位置。问题是,我想尝试至少5或10次,我想在每次尝试之间延迟,以便在每次尝试后在屏幕上显示错误消息(FailedLocationMSG)。我之所以想要这种延迟,是因为有些时候gps开始工作并获得实际位置需要一些时间。我已经尝试了很多东西而且我无法使它发挥作用。我们的想法是拥有一个类似于“终端”的界面。我会在每次尝试后显示一条消息(错误,再次尝试1/5 ..错误2/5 ......)。问题是,我尝试过使用Handler和Thread.sleep,但是我总是把屏幕锁定,每次尝试都看不到屏幕上显示的错误信息。
这是我获取位置的方法:
int breakloop=0;
private void GetLocation(){
locationmanager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
Criteria cri=new Criteria();
String provider=locationmanager.getBestProvider(cri,false);
if(provider!=null & !provider.equals("")){
//Get location
final Location location=locationmanager.getLastKnownLocation(provider);
locationmanager.requestLocationUpdates(provider,2000,10,this);
while(breakloop<10){
breakloop++;
if(location!=null)
onLocationChanged(location);
else
FailedLocationMSG(breakloop);
}
}else
Toast.makeText(getApplicationContext(),"Provider is null",Toast.LENGTH_LONG).show();
}
答案 0 :(得分:0)
您可以使用FutureTask
和Callable
进行位置检查,并等待其返回值。
public class LocationChecker implements Callable<Location> {
@Override
public Location call() throws Exception {
//do your stuff for location check
return location;
}
}
在您的方法中,您可以执行类似
的操作LocationChecker lc = new LocationChecker();
FutureTask<Location> ft = new FutureTask<Location>(lc);
ExecutorService es = Executors.newCachedThreadPool();
es.execute(ft);
Location loc;
int attempts = 0;
while(attempts < 10) {
if(ft.isDone() && loc != null) {
es.shutdown();
break;
}
else if(ft.isDone() && loc == null) {
ft = new FutureTask<Location>(lc);
es.execute(ft);
attempts++;
}
loc = ft.get();
}
这将检查您的位置并等待结果(十次)。