2013-09-22 4 views
1

У меня проблема с моим приложением. Мое приложение на самом деле является сервисом. У меня есть Main extends Service, у него есть переменная Looper looper, чтобы получить обработчик HandlerThread. В функции onCreate я инициализирую диспетчер местоположений, приемник местоположения и HandlerThread (который устанавливает его петлю в переменную looper), затем я пытаюсь использовать requestLocationUpdates, передавая переменную looper как looper. Я получаю ошибкуСбой приложения для Android (looper = null)

09-22 17:30:24.069: E/AndroidRuntime(1414): Caused by: java.lang.IllegalArgumentException: looper==null 

Должен ли я сделать что-нибудь еще для этого HandlerThread? Может быть, начать??

Я не вставляю код, так как он довольно длинный, и я не знаю соответствующей части, которая была бы подходящей для решения проблемы. Поэтому я хотел бы передать любой код, который вам может понадобиться (HandlerThread? Что-нибудь еще?)

Спасибо за любую помощь.

** EDIT * *

Хорошо 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 он разбивает весь эмулятор, убивая его процессы (?).

+0

Вы должны хотя бы опубликовать, какой код вы можете использовать для классов, onCreate и threader. – Jems

+0

@ Джемс добавил код. – Ziker

+0

Почему вы расширяете HandlerThread? – pskink

ответ

2

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

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

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

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

+0

Хорошо, кажется рациональным, Я сделал то, что вы сказали - я получаю сообщение об ошибке 'Только один петлитель может быть создан для каждой нити' Я не создаю ни одного петлителя, просто инициализирую этот обработчик и получаю его петлитель. Я добавлю, что у меня есть lt.run() после его инициализации, но он никогда не переходит в эту функцию. – Ziker

+0

Это звучит как отдельная проблема, поиск ошибки на этом сайте. И я исправил свой ответ, чтобы использовать start() вместо run(). – Jems

+1

ну, 'start()' вместо 'run()' исправлена ​​ошибка. Он также работает (получение места). Не могли бы вы рассказать мне, почему функция 'onStatusChanged' вызывается на моем LocationListener каждый раз, когда мое приложение использует' onLocationChanged' ?? Это нормально? Я думал, что он вызывается только тогда, когда поставщик меняет свой статус:> – Ziker

Смежные вопросы