【发布时间】:2013-11-26 10:42:47
【问题描述】:
我有一个奇怪的问题,我无法理解。我可以使用 LocationManager 及其 requestLocationUpdates 方法来接收位置更新。我有一个实现 LocationListener 的简单类:
public class PrisLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location location)
{ ... }
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{ ... }
@Override
public void onProviderEnabled(String provider)
{ ... }
@Override
public void onProviderDisabled(String provider)
{ ... }
}
我通过为它创建一个单独的线程在我的 Activity 中使用这个类:
// create seperate thread for location callbacks
mPrisLocationListener = new PrisLocationListener();
mLocationHandlerThread = new HandlerThread("LocationHandlerThread");
mLocationHandlerThread.start();
然后将其传递给 LocationManager:
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,
mPrisLocationListener,
mLocationHandlerThread.getLooper());
上述工作按预期工作,我可以获取设备的 GPS 位置。
我还想要 GPS 状态信息(卫星计数、TTFF 等),所以我创建了另一个实现 GpsStatus.Listener 的类:
public class PrisGpsListener implements GpsStatus.Listener
{
@Override
public void onGpsStatusChanged(int event)
{ ... }
}
当我尝试使用上述类时,问题就开始了。在我的 Activity 和 LocationListener 的同一点上,我初始化 GpsListener 的一个实例并将其传递给 LocationManager:
mPrisGpsListener = new PrisGpsListener();
if(!mLocationManager.addGpsStatusListener(mPrisGpsListener)) {
Log.i("Activity: ","addGpsStatusListener failed"); // doesn't fail, addGpsStatusListener returns true
}
// LocationManager.requestLocationUpdates called after addGpsStatusListener
问题是,如果我将“addGpsStatusListener”调用添加到我的代码中,位置服务不会发生任何事情。也就是说,我不仅没有从 GpsListener 获得任何状态更新,而且我也不再获得正常的位置更新。调用相关函数时,Logcat 根本不显示任何内容。
奇怪的是 requestLocationUpdates 本身可以正常工作,但是调用 addGpsStatusListener 会使一切都失败。我不知道在这里尝试什么,所以任何建议都将不胜感激。
编辑:
正如 Rafael 所指出的,当从 Activity::onCreate() 调用时,所有这些都可以正常工作......但是,(这应该是我首先提到的事情之一),在我的主 Activity 中有一个单独的函数调用上述 LocationManager 方法并实例化相关对象。 我通过 JNI 从本机代码调用方法
在创建 Activity 一段时间后使用 JNI 调用该方法。
【问题讨论】:
-
呃,抱歉,我自己从未与 JNI 合作过。如果您不将 WorkerThread 的循环器传递给 LocationUpdates,您可以尝试是否有任何不同。还要使这个方法真正被调用的舒尔(即使用日志)。但是,您还应该包含您的 C 代码以供下一个阅读。也许您的错误是在您的本机代码中完成的。
-
原来是线程问题。我已经在自己的回答中解释了我的理解。