문제

사용자 위치를 추적하는 테스트 응용 프로그램을 작성합니다.아이디어는 위치를 시작할 수있는 서비스를 시작할 수 있다는 것입니다.지금은 INTENTService를 사용하고 있습니다.

서비스 코드 (작동하지 않는 ...)는 그 것처럼 보입니다 :

public class GpsGatheringService extends IntentService {

// vars
private static final String TAG = "GpsGatheringService";
private boolean stopThread;

// constructors
public GpsGatheringService() {
    super("GpsGatheringServiceThread");
    stopThread = false;
}

// methods
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand()");
    return super.onStartCommand(intent, flags, startId);
}

@Override
protected void onHandleIntent(Intent arg0) {
    // this is running in a dedicated thread
    Log.d(TAG, "onHandleIntent()");
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    LocationListener locationListener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged()");
        }

        @Override
        public void onProviderEnabled(String provider) {
            Log.d(TAG, "onProviderEnabled()");
        }

        @Override
        public void onProviderDisabled(String provider) {
            Log.d(TAG, "onProviderDisabled()");
        }

        @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "onLocationChanged()");
        }
    };
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

    while (!stopThread) {
        try {
            Log.d(TAG, "Going to sleep...");
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy()");
    stopThread = true;
}
.

}

현재 "잠자는 것입니다 ..."의 출력은 현재 일어나는 유일한 것입니다.스레드가 살아있는 이유를 유지하는 몇 가지 메커니즘이 필요합니다 (그렇지 않으면 수신기가 상태 업데이트를 위해 더 이상 더 이상 도달 할 수 없기 때문에 CPU 시간이 없으므로 낭비가 선호되는 방식이 아니라는 것 같습니다). 다른 방법의 톤이있는 경우에도 응용 프로그램 동작 (GPS 좌표의 로깅)을 실현하는 방법에 대해서도이 성격의 문제를 해결하기위한 기술을 배우는 기술을 배우는 방법에 관심이 있습니다!

도움이 되었습니까?

해결책

IntentService의 스레드를 어떻게 유지합니까?

당신은 그렇지 않습니다.이와 같은 시나리오에서 IntentService를 사용하지 않습니다.

나는 스레드를 유지하는 메커니즘이 필요합니다 (그렇지 않으면 청취자가 상태 업데이트를 위해 더 이상 청취자가 도달 할 수 없으므로 낭비 시간이 없으므로 낭비는 선호하는 방식이 아니라는 것 같습니다)

아니오,이 경우 Service가 괜찮을 것입니다, 당신이 서비스가 사라지는시기를 제어하기 때문에, 생성하는 모든 스레드의 수명을 제어합니다. IntentService는 귀하의 의도 된 목적으로 부적합합니다. 왜냐하면 서비스가 사라지고 이 스레드의 수명을 제어합니다.

다른 팁

원격 서비스 를 사용하는 것을 고려하십시오.그것은 나를 위해 일했습니다.

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