我的应用程序有问题。我的应用程序实际上是一项服务。我有Main Extended Service,它有私有Looper looper变量来获取HandlerThread looper。在onCreate函数中,我初始化位置管理器,位置侦听器和HandlerThread(将其循环器设置为循环器变量),然后尝试使用requestLocationUpdates将循环器变量作为循环器传递。我得到一个错误

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

最佳答案

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


  此方法返回与此线程关联的Looper。如果此线程尚未启动,或者由于任何原因isAlive()返回false,则此方法将返回null。如果已启动此线程,则此方法将阻塞,直到循环程序已初始化。


由于您是在LooperThread的构造函数中调用此方法的,因此您当然还没有启动它(通过调用start())。
该方法返回null,它本身是有效的,并且构造函数完成,但是随后您在requestUpdates()中传递null,这将导致崩溃。

您将需要启动线程,然后获取对循环程序的引用。在尝试将其用于其他方法之前,请确保已准备就绪。

10-07 22:22