Android应用崩溃(looper = null)

时间:2013-09-22 17:57:32

标签: android android-service android-2.2-froyo looper

我的应用有问题。我的申请实际上是一项服务。我有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上它通过杀死它的进程(?)来崩溃整个模拟器。

1 个答案:

答案 0 :(得分:3)

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

  

此方法返回与此线程关联的Looper。如果此线程未启动或isAlive()因任何原因返回false,则此方法将返回null。如果此线程已经启动,则此方法将阻塞,直到looper已初始化为止。

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

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