2013-09-22 5 views
1

내 앱에 문제가 있습니다. 내 응용 프로그램은 실제로 서비스입니다. 나는 Main Service를 확장했다. HandlerThread 루퍼를 얻으려면 개인 루퍼 루퍼 변수가있다. onCreate 함수에서 위치 관리자, 위치 수신기 및 HandlerThread (루퍼 변수를 루퍼로 설정 함)를 초기화 한 다음 requestLocationUpdates을 루퍼 변수를 루퍼로 전달하려고합니다. 오류가 발생했습니다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"); 
    } 

} 

그리고 마지막에

는이 응용 프로그램에 대한 로그 캣이 :

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.3.3에 2.2 에뮬레이터에서 발생 프로세스를 죽여 전체 에뮬레이터 (?).

+0

적어도 onCreate 클래스와 핸들러 스레드의 코드를 게시해야합니다. – Jems

+0

@Jems가 코드를 추가했습니다. – Ziker

+0

왜 HandlerThread를 확장하고 있습니까? – pskink

답변

2

은에서 : http://developer.android.com/reference/android/os/HandlerThread.html#getLooper%28%29

이 메소드는,이 thread에 관련 지을 수 루퍼를 반환합니다. 이 thread가 기동하지 않았던 경우, 또는 어떠한 이유로써 isAlive()가 false를 돌려주는 경우,이 메소드는 null를 돌려줍니다. 이 스레드가 시작된 경우이 메서드는 루퍼가 초기화 될 때까지 차단됩니다.

LooperThread의 생성자에서이 메서드를 호출하므로 당연히 아직 시작하지 않았습니다 (start() 호출). 이 메서드는 자체적으로 유효한 null을 반환하며 생성자는 완료되지만 나중에 null을 requestUpdates()에 전달하면 충돌이 발생합니다.

스레드를 시작한 다음 루퍼에 대한 참조를 얻어야합니다. 다른 방법으로 사용하기 전에 준비되었는지 확인하십시오.

+0

좋아, 합리적인 것 같습니다. 나는 당신이 말한대로 했어요 - 오류 메시지가 나타납니다. '스레드 당 하나의 루퍼 만 만들 수 있습니다. ' 루퍼를 만들지 않고이 handlerthread를 초기화하고 루퍼를 가져옵니다. 나는 그것을 초기화 한 후에 lt.run()을 추가 하겠지만, 결코 그 함수에 들어 가지 않는다. – Ziker

+0

이것은 별개의 문제로 더 많이 들리지만이 사이트에서 오류를 검색하십시오. 그리고 run() 대신 start()를 사용하도록 내 대답을 수정했습니다. – Jems

+1

잘'run()'대신'start()'가 오류를 수정했습니다. 그것은 또한 작동합니다 (위치를 얻음). 내 앱이 onLocationChanged를 사용할 때마다 LocationListener에서 onStatusChanged 함수가 호출되는 이유를 설명해 주시겠습니까? 정상입니까? 나는 제공자가 상태를 바꿀 때만 호출된다고 생각했다 :> – Ziker