2011-08-06 9 views
2

나는 다음과 같은 코드 조각이 :얻기 서비스에 의해 호출 스레드의 컨텍스트

public class DumpLocationLog extends Thread { 
    LocationManager lm; 
    LocationHelper loc; 
    public void onCreate() { 
     loc = new LocationHelper(); 
     lm = (LocationManager) Context.getSystemService(Context.LOCATION_SERVICE); 
    } 
    public void run() { 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, loc); 
    } 
} 

나는 그것이 원격 서비스에서 실행할 수 있지만, 라인 lm = (LocationManager) Context.getSystemService(Context.LOCATION_SERVICE);에 나는 물론 NullPointerException 오류가 원하는을 context이 null이므로

여기에서 컨텍스트를 어떻게 얻을 수 있습니까? getBaseContext() 또는 getApplicationContext()이 작동하지 않습니다.

답변

7

Thread은에 대한 직접 액세스 할 수없는 것 Context 기본적으로; 당신은 그것을 통과해야 할 수도 있습니다. 스레드도 onCreate 메서드 (나는 당신이 수동으로 호출하는 것) 필요하지 않습니다 - 난 그냥 생성자를 변경합니다. 당신은 스레드의 생성자의 상황에 전달할 수 있습니다하십시오 Service 내부에서 사용하는 경우

public class DumpLocationLog extends Thread { 
    LocationManager lm; 
    LocationHelper loc; 
    public DumpLocationLog(Context context) { 
     loc = new LocationHelper(); 
     lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    } 
    public void run() { 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, loc); 
    } 
} 

당신은 new DumpLocationLog(this);로 인스턴스화 것 (서비스가 컨텍스트의 서브 클래스이기 때문에 this 작품 여기). start() 메서드를 호출하여 스레드를 시작합니다.

+0

나는'new DumpLocationLog (getApplicationContext()). start();'또는' 새로운 DumpLocationLog (getBaseContext()). start();'그러나 아무 것도 작동하지 않았습니다. – noloman

+1

이것은 내가 시도하고 일한 것입니다! '콘텐츠 컨텍스트'와'새로운 DumpLocationLog (context, latString, lngString) .start();' – noloman

2

클래스는 ServiceClassName.this.getContext를 사용할 수있는 서비스 내부에 내부 클래스 인 경우는, 생성자를 통해 유효한 상황에 합격하거나, 수()

+0

생성자를 통해 유효한 컨텍스트를 전달하려고했지만 '안드로이드에서 Looper 준비를 호출하지 않은 스레드 내부에서 처리기를 만들 수 없습니다.'라는 예외가 발생합니다. 내 수업은 내부 수업이 아닙니다. 내 수업을 내부 수업으로 만들 수 있습니까? 이것에 대해서는 잘 모르겠다 .. – noloman

관련 문제