【问题标题】:Android app crashing (looper = null)Android 应用程序崩溃(looper = null)
【发布时间】:2013-09-27 15:02:18
【问题描述】:

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

【问题讨论】:

  • 您至少应该发布类、onCreate 和处理程序线程的代码。
  • @Jems 添加了代码。
  • 你为什么要扩展一个HandlerThread?
  • 得到它的looper :> 这是我被告知的最后一个问题的答案。还有其他方法吗? (我需要让我的应用保持持久/循环,因此它每 5~ 分钟获取一次位置并对其进行处理)。
  • 调用 ht = new HandlerThread(); ht.start(); handler = new Handler(ht.getLooper())

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


【解决方案1】:

发件人:http://developer.android.com/reference/android/os/HandlerThread.html#getLooper%28%29

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

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

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

【讨论】:

  • 好吧,看起来很合理,我按照你说的做了 - 我收到错误消息 Only one looper may be created per thread 我没有创建任何 looper,只是初始化这个 handlerthread 并获取它的 looper。我会补充一点,初始化后我有 lt.run(),但它永远不会进入该函数。
  • 这听起来更像是一个单独的问题,请在此站点上搜索错误。我更正了使用 start() 而不是 run() 的答案。
  • 好吧,start() 而不是 run() 修复了错误。它也可以工作(获取位置)。你能告诉我为什么每次我的应用程序使用onLocationChanged 时都会在我的LocationListener 上调用函数onStatusChanged 吗?正常吗?我认为只有在提供者更改其状态时才会调用它:>
  • 我对此不太了解 - 可能是因为您正在调用 removeUpdates(listener)
  • 好的,我会自己解决这个问题。非常感谢!
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2018-06-27
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多