5

ユーザーの位置を追跡するテスト アプリケーションを作成しています。アイデアは、位置情報の更新を登録するサービスを開始できるということです。今のところ、そのために 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;
}

}

現在発生しているのは、「Going to sleep...」の出力だけです。スレッドを維持し(ステータス更新のためにリスナーに到達できなくなるため)、CPU時間を無駄にしないメカニズムが必要です(ビジーループは推奨される方法ではないと思います)。アプリケーションの動作 (GPS 座標のログ記録) を実現する方法は他にもたくさんありますが、この性質の問題を解決する手法を学ぶために、この方法の解決策に興味があります!

4

2 に答える 2

9

IntentService の Thread を維持するにはどうすればよいですか?

あなたはそうしない。IntentServiceこのようなシナリオでは使用しません。

スレッドを維持するメカニズムが必要です(そうしないと、ステータス更新のためにリスナーに到達できなくなるため)、CPU時間を無駄にしません(ビジーループは推奨される方法ではないと思います)

いいえ、この場合Serviceは問題ありません。サービスがいつなくなるかを制御し、作成したスレッドの有効期間を制御するなどです。サービスがいつなくなるかを制御し、制御するため意図IntentServiceた目的には適していません。スレッドの寿命。

于 2012-07-28T10:55:34.923 に答える
0

リモート サービスの使用を検討してください。それは私のために働いた。

于 2012-07-28T10:46:55.223 に答える