在返回值

时间:2018-01-06 15:29:23

标签: java android callback wait

我找到了类似问题的答案,但尚未找到适合我的答案。我在helper类中有一个方法,它返回当前纬度的用户的String值。这是代码。

public String getLatitude(){
    createLocationListener();
    defineCriteria();
    createLocationManager();
    getLocation();
    return String.valueOf(d_latitude);
}

我的问题是类变量d_latitudegetLocation()或更具体的onLocationChanged()方法中正确更新,但getLatitude()返回null d_latitudegetLocation()完成之前。就像我说的那样,我发现的解决方案无论出于什么原因都不适合我,或者它们对我的情况看起来太复杂了(200行特殊类等)。

private void getLocation(){
    //get single shot location update, null looper sets single shot
    locationManager.requestSingleUpdate(criteria, locationListener, null);
}


private void createLocationListener(){
    locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(android.location.Location location){
            d_latitude = location.getLatitude();
            Toast.makeText(Location.this, "olc lat= " +d_latitude, Toast.LENGTH_SHORT).show();
            stopLocationListener();
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras){
        }
        @Override
        public void onProviderEnabled(String provider){
        }
        @Override
        public void onProviderDisabled(String provider){
        }
    };
}

1 个答案:

答案 0 :(得分:0)

您需要了解异步函数和侦听器如何协同工作。

例如,如果您更改了方法

private void getLocation(LocationListener l) {
    locationManager.requestSingleUpdate(criteria, l, null);
}

然后你可以传入监听器,它会回调该方法,然后等待"对于不同线程的响应。

您可以定义自己的回调接口以从外部获取纬度。

一个例子是

public interface MyLocatonListener {
    void onLatChanged(Latitude lat);
    void onLongChanged(Longitude lng);
} 

你传递了一个这样的实例,但是,如果没有它,继续,因为你已经有了内置的监听器......

由于您无法保证立即回复,因此您无法return使用此方法,因此请将其设为无效

public void getLatitude(){
    defineCriteria();
    createLocationManager();
    getLocation(new LocationListener() {
        @Override
        public void onLocationChanged(android.location.Location location){
            // latitude is "returned" here 
            d_latitude = location.getLatitude();
            Toast.makeText(Location.this, "olc lat= " +d_latitude, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras){
        }
        @Override
        public void onProviderEnabled(String provider){
        } 
        @Override
        public void onProviderDisabled(String provider){
        }
    });
    // d_latitude == null here, most likely 
}

另一个例子,您可以提取LocationListener参数,直至getLatitude方法,然后将其传递到getLocation

public void getLatitude(LocationListener l){
    defineCriteria();
    createLocationManager();
    getLocation(l);
}

顺便说一句,我认为您可以在此方法之前定义标准和位置管理器