延迟循环而不锁定屏幕

时间:2015-04-19 14:24:40

标签: java android loops delay

我一直在开发应用程序,我需要获取设备的位置。问题是,我想尝试至少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();

}

1 个答案:

答案 0 :(得分:0)

您可以使用FutureTaskCallable进行位置检查,并等待其返回值。

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();
}

这将检查您的位置并等待结果(十次)。