我的应用有问题。我的申请实际上是一项服务。我有Main扩展服务,它有私有Looper looper变量来获取HandlerThread looper。在onCreate
函数中,我初始化位置管理器,位置监听器和HandlerThread(将其looper设置为looper变量),然后我尝试使用requestLocationUpdates
将looper变量作为looper传递。我收到错误
09-22 17:30:24.069: E/AndroidRuntime(1414): Caused by: java.lang.IllegalArgumentException: looper==null
我应该对此HandlerThread做任何其他事情吗?也许开始吧?:>
我不粘贴任何代码,因为它很长,而且我不知道适合解决问题的相关部分。因此,我想传递您可能需要的任何代码(HandlerThread?还有其他什么?)
感谢您的帮助。
** 编辑 * *
好的,onCreate功能:
public void onCreate() {
super.onCreate();
Log.d("Service", "Service onCreate starts");
running = true;
lt = new LooperThread("GPSIntentLT");
serviceLocationM = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
serviceLocationL = new MyLocationListener();
requestUpdates(serviceLocationL);
Log.d("Service", "Service onCreate ends");
}
requestUpdates函数(上面调用,出现错误):
private void requestUpdates(LocationListener listener)
{
Log.d("Service", "requestUpdates starts");
serviceLocationM.removeUpdates(listener);
flag = displayGpsStatus();
switch(flag)
{
case 0:
Log.d("Service", "No Location Provider");
break;
case 1:
Log.d("Service", "Network Provider");
serviceLocationM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10, 25, listener, theLooper);
break;
case 2:
Log.d("Service", "GPS Provider");
serviceLocationM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 25, listener, theLooper);
break;
}
Log.d("Service", "requestUpdates ends");
}
和HandlerThread:
private class LooperThread extends HandlerThread{
public LooperThread(String name) {
super(name);
Log.d("Service", "LooperThread constructor starts");
theLooper = getLooper();
Log.d("Service", "LooperThread constructor ends");
}
@Override
public void run() {
super.run();
Log.d("Service", "LooperThread run called");
}
}
最后,这个应用程序的logcat:
09-22 18:21:47.997: D/Service(386): Service onCreate starts
09-22 18:21:47.997: D/Service(386): LooperThread constructor starts
09-22 18:21:48.007: D/Service(386): LooperThread constructor ends
所以它确实落在了requestLocationUpdates函数上,它发生在2.2模拟器上,在2.3.3上它通过杀死它的进程(?)来崩溃整个模拟器。
答案 0 :(得分:3)
来自:http://developer.android.com/reference/android/os/HandlerThread.html#getLooper%28%29
此方法返回与此线程关联的Looper。如果此线程未启动或isAlive()因任何原因返回false,则此方法将返回null。如果此线程已经启动,则此方法将阻塞,直到looper已初始化为止。
由于您在LooperThread的构造函数中调用此方法,当然您还没有启动它(通过调用start()
)。
该方法返回null,它本身是有效的,构造函数完成,但之后你在requestUpdates()
中传递null,这会导致崩溃。
您需要启动该线程,然后获取对该循环器的引用。在尝试以另一种方法使用它之前,请确保它已准备就绪。