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 是接口还是类?的主要内容,如果未能解决你的问题,请参考以下文章