문제

나는 다음과 같은 다음 문제가있다.루퍼가있는 내 스레드 구현이 있습니다.

public class GeoLocationThread extends Thread{

public Handler handler;
private General general;


public void run(){
    Looper.prepare();       
    handler = new IncomingHandler(general);
    Looper.loop();          

}

public GeoLocationThread(General general){
    this.general=general;
}



private static class IncomingHandler extends Handler{
    private final WeakReference<General> mService; 

    IncomingHandler(General service) {
        mService = new WeakReference<General>(service);
    }

    @Override
    public void handleMessage(Message msg)
    {
         General service = mService.get();
         if (service != null) {
             Location location=service.getLl().getLocation();
                if(location.getAccuracy()<40){                                                                                      
                    service.setOrigin(new GeoPoint((int) (location.getLatitude() * 1E6),(int) (location.getLongitude() * 1E6)));
                }
         }
    }

}
.

}

와 나는 다음을하고 싶습니다 :

GeoLocationThread locationThread=new GeoLocationThread(this);
locationThread.start();
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll, locationThread.handler.getLooper());
.

여기서 lm은 locationManager입니다.내 로그 및 테스트에서 locationThread.handler.getLooper()가 루퍼 대신 null을 반환한다고 말할 수 있습니다.

나는 그것이 왜 그것이 널인지 모르겠다.True를 반환 한 locationThread.isAlive()를 호출하려고했습니다.나는 또한 내가 아는 locationThread.handler;를 얻으려고 노력했다. 나는 또한 끈끈이를 많이했지만, 나는 문서 이상을 발견하지 못했다.

답변을 위해 미리 대단히 감사드립니다.

도움이 되었습니까?

해결책

코드는 서로 동기화되지 않기 때문에 코드가 null를 읽는 것입니다. getLooper()가 완료되고 핸들러가 구성 될 때까지 Handler에서 Looper.prepare()를 성공적으로 호출 할 수 없습니다. 다른 스레드가 실행되는 동안 Thread.start()가 차단하지 않기 때문에 (물론, 왜 그럴 것인가?) 스레드의 run() 블록과 위치를 설정하려는 코드 사이에 경쟁 조건을 만들었습니다. 경청자. 이렇게하면 먼저 실행할 수있는 사람을 기반으로 다른 장치에 대해 다른 결과가 생깁니다.

또한 위치 업데이트를 등록하는 것이 이미 비동기 프로세스이므로 보조 스레드가 필요한 이유를 불가사합니다. 보조 Looper를 전달하지 않고 리스너에 업데이트를 요청하기 만하면 새 업데이트를 사용할 수있을 때 리스너가 게시됩니다.이 프로세스 중에 주 스레드가 블록을 유지하지 않습니다.

다른 팁

생성자에서 super ()를 호출해야합니까?상위 생성자가 호출되지 않으므로 루퍼가 설정되지 않을 수 있습니다.

확인, 이것을 시도하십시오.이렇게하십시오 :

public class GeoLocationThread extends Thread{
.

이 있습니다.

public class GeoLocationThread extends HandlerThread{
.

다음을 수행 할 수 있습니다. 핸들러를 구성하거나 루퍼가 필요한 경우

를 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top