com.google.android.gms.location.LocationCallback 是接口还是类?

Posted

技术标签:

【中文标题】com.google.android.gms.location.LocationCallback 是接口还是类?【英文标题】:Is com.google.android.gms.location.LocationCallback an Interface or Class? 【发布时间】:2020-01-17 01:35:53 【问题描述】:

我想使用这种方法获取位置更新: FusedLocationProviderClient#requestLocationUpdates(LocationRequest locationRequest, LocationCallback locationCallback, Looper looper)

*** 中实现此方法的大多数答案都必须覆盖 LocationCallback 方法。一个最近的例子可以找到in this question

该问题的代码 sn-p 如下:

mLocationCallback = new LocationCallback() 

    @Override
    public void onLocationResult(LocationResult locationResult) 
        synchronized (SilentCurrentLocationProvider.this) 
            super.onLocationResult(locationResult);
            Location location = locationResult.getLastLocation();
    
;

但是当我尝试像这样初始化 LocationCallback 时。我不会被 android Studio 强制覆盖上述方法。当我检查 LocationCallback 类的源代码时,我发现它是普通的 java 类,并且存在 onLocationResult 方法,但这不是要覆盖的。

【问题讨论】:

这是一个抽象类:developers.google.com/android/reference/com/google/android/gms/… 我认为反编译器错误地将其显示为普通类 是的。你说的对。那么我该如何实现overirde方法呢?因为我有自己实现覆盖方法的知识和习惯,这些方法过去由 Android Studio 管理。但在这种情况下,Android Studio 并没有给我建议。 编译器可能显示错误,但如果您查看方法签名,它们不是final 也不是abstract,这就是编译器不强制您覆盖的原因。 【参考方案1】:

编译器强制您覆盖的唯一一次是在 abstract 实现的情况下。您看到的LocationCallBack 类不包含任何抽象成员。注意他们如何拥有 。这意味着它已经定义了“具体”实现。还有一点要注意,它们不是final,这意味着它们可以被覆盖或根本不被覆盖,这就解释了为什么编译器不强迫你。

您实际上是在创建一个匿名类,然后选择要覆盖的类。在您的情况下,您选择了 onLocationResult() 方法。

mLocationCallback = new LocationCallback()  //Creating anonymous class to provide our own implementation for onLocationResult

@Override
public void onLocationResult(LocationResult locationResult) 
    synchronized (SilentCurrentLocationProvider.this) 
        super.onLocationResult(locationResult);
        Location location = locationResult.getLastLocation();
  
;

【讨论】:

以上是关于com.google.android.gms.location.LocationCallback 是接口还是类?的主要内容,如果未能解决你的问题,请参考以下文章