如何在Android的OnCompleteListener中返回值?

时间:2018-09-20 08:39:00

标签: android

我正在尝试获取智能手机的GPS,例如以下代码:

Activity.java 中,我使用以下代码获取 GPS

private GPSClass gps;
gps.getGPSLocation();

GPSClass.java

public void getGPSLocation(){
        FusedLocationProviderClient mLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
        mLocationClient.getLastLocation().addOnCompleteListener(mContext, new OnCompleteListener<Location>() {
            @Override
            public void onComplete(@NonNull Task<Location> task) {
                if(task.isSuccessful()){
                    mLocation = task.getResult();
                    Log.i("getLocation---LOCATION", mLocation.getLatitude() + "/"
                            + mLocation.getLongitude());

                }
            }
        });
    }

但是如何在 GPSClass.java 中返回值?

我尝试替换

public void onComplete

代替

public Location onComplete

但是显示错误

'onComplete(Task<Location>)' in 'Anonymous class derived from com.google.android.gms.tasks.OnCompleteListener' clashes with 'onComplete(Task<TResult>)' in 'com.google.android.gms.tasks.OnCompleteListener'; attempting to use incompatible return type

我错过了什么吗?如何在OnCompleteListener中返回值?预先感谢。

2 个答案:

答案 0 :(得分:0)

例如,您可以使用回调

public void getGPSLocation(GPSCallback callback){
        FusedLocationProviderClient mLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
        mLocationClient.getLastLocation().addOnCompleteListener(mContext, new OnCompleteListener<Location>() {
            @Override
            public void onComplete(@NonNull Task<Location> task) {
                if(task.isSuccessful()){
                    mLocation = task.getResult();
                    Log.i("getLocation---LOCATION", mLocation.getLatitude() + "/"
                            + mLocation.getLongitude());
                    callback.onLocation(mLocation);
                }
            }
        });
    }

创建一个名为GPSCallback的接口,例如

interface GPSCallback{
void onLocation(Location location);
}

并通过回调调用方法

gps.getGPSLocation(new GPSCallback() {
    void onLocation(Location location) {
        // do what you need to do with the location
    }
});

答案 1 :(得分:0)

这是因为您具有回调系统,并且不能将直接返回方法与回调混合使用。

您似乎想要一个简单的方法来直接为您提供位置,但是如您所见,FusedLocationProviderClient.getLastLocation()返回一个Task而不是一个直接值。因此,当您使用getGPSLocation()调用方法时,必须等待任务完成才能检索该值。

如果您想要一个简单的解决方案,则可以在活动中直接调用FusedLocationProviderClient,而不用创建另一个类:

public class MyActivity extends Activity {

    private FusedLocationProviderClient mLocationClient;

    @Override
    protected void onCreate(){

        mLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
        mLocationClient.getLastLocation().addOnCompleteListener(mContext, new OnCompleteListener<Location>() {
            @Override
            public void onComplete(@NonNull Task<Location> task) {
                if(task.isSuccessful()){
                    handleLocation(task.getResult();
                }
            }
        });
    }

    private void handleLocation(Location location){
        //Do your handling here
    }
}