Java 如何从JobService中调用fusedLocationClient.getLastLocation()?
我正试图实现这里描述的Java 如何从JobService中调用fusedLocationClient.getLastLocation()?,java,android,service,executor,Java,Android,Service,Executor,我正试图实现这里描述的getLastLocation().addOnSuccessListener:但在我的例子中,是在JobScheduler定期运行的JobService中实现的 以下是我的就业服务中有意义的部分: public class PeriodicJob extends JobService { final String TAG = "BNA.Job"; private FusedLocationProviderClient fusedLocationClient;
getLastLocation().addOnSuccessListener
:但在我的例子中,是在JobScheduler定期运行的JobService中实现的
以下是我的就业服务中有意义的部分:
public class PeriodicJob extends JobService {
final String TAG = "BNA.Job";
private FusedLocationProviderClient fusedLocationClient;
@Override
public void onCreate() {
super.onCreate();
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
Log.i(TAG, "onCreate");
}
@Override
public boolean onStartJob(JobParameters params) {
Log.d(TAG, "Job started..."); // logs every 15mins
fusedLocationClient.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// Got last known location. In some rare situations this can be null.
if (location != null) {
Log.d(TAG, "got Location: " + location);
Log.d(TAG, "Accuracy:" + location.getAccuracy()+", LON:"
+location.getLongitude() + ", LAT:" + location.getLatitude());
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
(...) // never runs
});
return true;
}
公共类PeriodicJob扩展了JobService{
最后一个字符串TAG=“BNA.Job”;
私有FusedLocationProviderClient fusedLocationClient;
@凌驾
public void onCreate(){
super.onCreate();
fusedLocationClient=LocationServices.getFusedLocationProviderClient(此);
Log.i(标记“onCreate”);
}
@凌驾
公共布尔值onStartJob(JobParameters参数){
Log.d(标记“作业已启动…”);//每15分钟记录一次
fusedLocationClient.getLastLocation()文件
.addOnSuccessListener(此,新的OnSuccessListener(){
@凌驾
成功时的公共无效(位置){
//已获取最后一个已知位置。在某些罕见情况下,此值可以为空。
如果(位置!=null){
Log.d(标记“获取位置:”+位置);
Log.d(标记“accurity:+location.getaccurity()+”,LON:“
+location.getLongitude()+”,LAT:“+location.getLatitude());
}
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
(…)//从不运行
});
返回true;
}
当我运行它时(它编译得很好),我得到:原因:java.lang.ClassCastException:(…)PeriodicJob不能转换为java.util.concurrent.Executor
我查看了,但仍然无法使其工作。只需调用.addOnSuccessListener(new OnSuccessListener()
,就像第二个问题的答案所示,不会抛出错误,但代码从未执行过(至少,没有写日志)
我怎样才能让onSuccess的呼叫正常工作
编辑:事实上,它一直在工作(没有第一个参数),我忽略了检测返回空位置的情况(我没有预料到).多亏了Mike M.!
PeriodicJob无法转换为java.util.concurrent.Executor
-您可以添加stacktrace,显示发生此崩溃的类中的类和行,以及那些引用行的代码,该示例看起来是针对活动中的实现的,这大概就是为什么addOnSuccessListener()
调用的第一个参数是this
,实际上,getLastLocation()
返回的任务有一个addOnSuccessListener()
重载,它接受一个活动
。但是,它也有一个重载,接受一个执行器
,这是它在设置中遇到的障碍。不过,还有另一个重载不需要这两个参数,所以您可以删除第一个此
参数。否则,您需要提供一个参数xecutor
在那里。@mike我已经试过了,没有抛出错误,但也没有发生任何事情。@ppartisan我将在稍后返回我的PC时添加代码。您如何确定“没有发生任何事情”?您是否在这些回调或日志中设置了断点?可能是第一件事?在给定的代码段中,您唯一要做的就是记录ifonSuccess()
是使用非null的位置调用的。
@MikeM。非常感谢,您是对的,没有Executor参数实际上导致了一切正常工作,我在onFailure例程中有一个日志条目,但当位置为空时没有记录任何内容,就是这样。在onSuccess开始时添加了一个日志条目之后我立刻看到它在运行。为你+1!