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时添加代码。您如何确定“没有发生任何事情”?您是否在这些回调或日志中设置了断点?可能是第一件事?在给定的代码段中,您唯一要做的就是记录if
onSuccess()
是使用非null的
位置调用的。
@MikeM。非常感谢,您是对的,没有Executor参数实际上导致了一切正常工作,我在onFailure例程中有一个日志条目,但当位置为空时没有记录任何内容,就是这样。在onSuccess开始时添加了一个日志条目之后我立刻看到它在运行。为你+1!