Сбой приложения Android (looper = null)

У меня проблема с моим приложением. Мое приложение на самом деле является сервисом. У меня есть служба Main extends, у нее есть частная переменная петлителя Looper для получения петлителя HandlerThread. В функции 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 он приводит к сбою всего эмулятора, убивая его процессы (?).


person Ziker    schedule 22.09.2013    source источник
comment
Вы должны по крайней мере опубликовать код, который вы можете для классов, onCreate и потока обработчика.   -  person Jems    schedule 22.09.2013
comment
@Jems добавил код.   -  person Ziker    schedule 22.09.2013
comment
Почему вы расширяете HandlerThread?   -  person pskink    schedule 22.09.2013
comment
Чтобы получить его петлитель :› Это то, что мне сказали в ответ на мой последний вопрос. Есть ли другой способ сделать это? (Мне нужно, чтобы мое приложение было постоянным/зацикленным, чтобы оно определяло местоположение каждые 5 минут и что-то с ним делало).   -  person Ziker    schedule 22.09.2013
comment
call ht = новый HandlerThread(); ht.start(); обработчик = новый обработчик (ht.getLooper())   -  person pskink    schedule 22.09.2013
comment
как тогда передать этот обработчик моему requestLocationUpdates?:›   -  person Ziker    schedule 22.09.2013
comment
Хорошо, в вашем случае вам не нужен обработчик, просто передайте ht.getLooper()   -  person pskink    schedule 22.09.2013


Ответы (1)


Откуда: http://developer.android.com/reference/android/os/HandlerThread.html#getLooper%28%29

Этот метод возвращает Looper, связанный с этим потоком. Если этот поток не был запущен или по какой-либо причине isAlive() возвращает false, этот метод вернет null. Если этот поток был запущен, этот метод будет заблокирован до тех пор, пока цикл не будет инициализирован.

Поскольку вы вызываете этот метод в конструкторе LooperThread, то, конечно, вы его еще не запустили (вызовом start()). Метод возвращает null, что само по себе допустимо, и конструктор завершается, но затем вы передаете null позже в requestUpdates(), что вызывает сбой.

Вам нужно будет запустить поток, а затем получить ссылку на петлитель. Убедитесь, что он готов, прежде чем пытаться использовать его в другом методе.

person Jems    schedule 22.09.2013
comment
Хорошо, кажется рациональным, я сделал то, что Вы сказали - я получаю сообщение об ошибке Only one looper may be created per thread Я не создаю никаких циклов, просто инициализирую этот обработчик и получаю его цикл. Я добавлю, что у меня есть lt.run() после его инициализации, но он никогда не входит в эту функцию. - person Ziker; 22.09.2013
comment
Это звучит как отдельная проблема, поищите ошибку на этом сайте. И я исправил свой ответ, чтобы использовать start() вместо run(). - person Jems; 22.09.2013
comment
ну и start() вместо run() исправили ошибку. Это также работает (получение местоположения). Не могли бы вы сказать мне, почему функция onStatusChanged вызывается в моем LocationListener каждый раз, когда мое приложение использует onLocationChanged?? Это нормально? Я думал он вызывается только когда провайдер меняет свой статус :› - person Ziker; 22.09.2013
comment
Я мало что знаю об этом - возможно, потому что вы вызываете removeUpdates(listener) - person Jems; 22.09.2013
comment
Хорошо, попробую разобраться сам. Большое спасибо! - person Ziker; 22.09.2013