1

座標とともにデータを10秒ごとにリモートサーバーに送信したいと思います。一番いいのは

public void onCreate( Bundle savedInstanceState ) {
  //snip
  locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 10000, 0, new SendingLocationListener() );
}

リスナーには次のコードがあります。

public void onLocationChanged( Location location ) {
  if( null == location ) return;
  TrackerNotifierTask task = new TrackerNotifierTask();
  task.execute( location );
}

in itのメソッドをTrackerNotifierTask使用するので、非常に簡単です。httpclientdoInBackground()

ここで、アクティビティを開始すると、onLocationChanged()が実行され、データがリモートサーバーに正常にヒットすることがわかります。しかし、一度だけ!後で何をしても、座標を変更したり、タスクが呼び出されたりすることはありません。

これはAndroidでそのようなことを実装する正しい方法ですか、それとも私はいくつかに頼りbackground-serviceますか?

4

3 に答える 3

3

Shrikantからのリンクから、LocationListener実装のクラス構造に関するヒントが得られました。

クラスは必ずしもとして定義する必要はありませんinner anonymous class。私はそれを内側と定義しましたが、名前を付けて、それも機能しました。

秘訣は、リスナーインスタンスをフィールドとして宣言する必要があるということです。

private LocationListener listener;

@Override
public void onCreate( Bundle savedInstanceState ) {
  //snip
  locationManager = (LocationManager)this.getSystemService( Context.LOCATION_SERVICE );
  listener = new MyLocationListener( SomeActivity.this );
  locationManager.requestLocationUpdates( provider, 1000, 0, listener );
}

それ以外の場合、次のように定義されている場合、最初の実行後にガベージコレクションされます。

locationManager.requestLocationUpdates( provider, 1000, 0, new MyLocationListener() );

それは解決策の半分でした。他の部分(minTimeについて)は未解決のままです。多分それはエミュレーターと関係があります...私は道を見つけたらすぐに欠けている部分を投稿します。

更新:実際のデバイスでは、座標が変更されたかどうかに関係なく、minIntervalによってリスナーが起動するようです。

于 2012-09-26T12:09:30.833 に答える
0

こちらをご覧ください。

LocationListenerとして実装すると、期待どおりに機能しanonymous classます。

于 2012-09-26T08:45:45.410 に答える
0

私が使用するとき、私は同様の問題を抱えています

private LocationListener mLocationListener1 = new LocationListener() {
   @Override
       public void onLocationChanged(Location location) {
       }
}

私のクラスでは、onLocationChangedは1回だけ呼び出されますが、「final」をに追加した後

private final LocationListener mLocationListener1 = new LocationListener() {

問題は解決しました。(私の場合、地上サービスで使用されます)

変数がfinalキーワードで定義されてい
ない場合、一度呼び出された後はガベージコレクションされ、再度呼び出されることはないようです...

于 2018-11-18T12:47:28.337 に答える