2

我的应用程序有问题。我的应用程序实际上是一项服务。我有 Main extends Service,它有私有 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");
}

和处理线程:

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 上它通过杀死它的进程(?)来崩溃整个模拟器。

4

1 回答 1

4

来自:http: //developer.android.com/reference/android/os/HandlerThread.html#getLooper%28%29

此方法返回与此线程关联的 Looper。如果这个线程没有被启动或者由于任何原因 isAlive() 返回 false,这个方法将返回 null。如果这个线程已经启动,这个方法会一直阻塞直到looper被初始化。

既然你在 LooperThread 的构造函数中调用了这个方法,那么你当然还没有启动它(通过调用start())。该方法返回 null,它本身是有效的,并且构造函数完成,但是您稍后在 中传递 null requestUpdates(),这会导致崩溃。

您将需要启动线程,然后获取对 looper 的引用。在尝试以另一种方法使用它之前,请确保它已准备就绪。

于 2013-09-22T18:48:09.203 回答