0

そのため、GPS 受信機が衛星にロックオンするまでにしばらく (約 10 ~ 12 秒) かかることはよく知られている事実です。Android LocationListener を使用して、位置情報の更新が開始されたときに通知を受け取りたいと考えています。例えば:

LocationListener をインスタンス化して呼び出すための次のコードを含むアクティビティがあります

public void startLocationUpdates() {
    try{
    Common.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            listener = new LocListener();
            if(Common.locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Common.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
            } else if(Common.locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
                Common.locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

これが LocationListener onLocationChanged 実装です。

public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        try{
            Common.currentLocation = new String(String.valueOf(location.getLatitude()) + "," + String.valueOf(location.getLongitude()));
            Log.i("LocListener",Common.currentLocation);
        } catch(Exception e) {
                e.printStackTrace();
        }

    }

Common.currentLocation 文字列は、locationUpdates の開始後に更新されます。ただし、このフィールドが更新されるまでメイン アクティビティを待ちたいと思います。

Common.currentLocation フィールドが更新されるのを待機する while ループをアクティビティに配置すると、スレッドが中断され、onLocationChanged メソッドが呼び出されません (ログ メッセージは出力されません)。

onLocationChanged が呼び出されて緯度と経度の値が利用可能になるとすぐに、 onLocationChanged メソッドから共通のインターフェイス/アクティビティに更新を取得する最良の方法は何ですか? どんな助けでも大歓迎です。

4

2 に答える 2

0

位置情報の更新をビジーウェイト(ループなど)で待つ必要はありません。LocationManagerメソッドを実装しrequestSingleUpdate(String provider, PendingIntent intent)ます。PendingIntentを使用して、更新が利用可能であることをアクティビティに通知することを検討してください。他にもさまざまな形式があります。詳細についてはrequestSingleUpdate、こちらをご覧ください: http ://developer.android.com/reference/android/location/LocationManager.html

于 2012-05-31T10:44:04.947 に答える
0

再利用性のためにリスナーをクラスに入れる必要がある場合は、情報を提供するためのメソッドがいくつかあります

覚えておくべき重要なことは、Android はイベント ドリブン システムであるため、ポーリングによって結果を「待機」する代わりに、クラスがイベントを作成し、そのイベントの関係者に応答できるようにする方法を作成する必要があるということです。

再利用性を必要としない場合の最も簡単な方法は、単純にリスナーを同じアクティビティに実装し、そこで処理を行うことです。

public class yourclass extends Activity implements LocationListener {
  ...

  public void onLocationChanged(Location location) {
     ...
  }

}

次の最も簡単な方法は、リスナーを使用してクラスにインターフェイスを作成することです。これはエラーがなく、メモリからではありませんが、一般的なアイデアを得ることができます。実際には、これはクラスとイベントリスナーの間に1つのレイヤーを配置するだけですが、そうですリスナーをクラスに分離して、他のアクティビティで簡​​単に使用できるようにします。また、複数のアクティビティ登録の登録解除などを考慮に入れるために何もしていません。

public mylistenerclass implements LocationListener {
   ...

   public interface LocationEvents { 
      public abstract void onLocationEvent(Location location); 
   }

   LocationEvents mListener = null; 

   public void registerForEvents(LocationEvents eventListener, ... any-params) {
      ... start listening for location stuff
      mListener = eventListener;

   }

    public void unregisterForEvents(LocationEvents eventListener) {
      ... end listening for location stuff
      mListener = null;

    } 

    public void onLocationChanged(Location location) {
         ... 
         if (null != mListener)
            mListener.onLocationEvent(location); 
    } 
}

public class yourclass extends Activity implement LocationEvents { ...

  @Override
  public void onResume() {
      super.onResume();      
      registerForEvents(locationEvent, anyparams); 
  }

  @Override
  public void onPause() {
      super.onPause();      
      unregisterForEvents(locationEvent); 
  }

}

サービスを使用したり、クラスからインテントをブロードキャストしたりすることもできます。ただし、他のアクティビティが機能を必要としない場合は、既存のアクティビティにリスナーを実装することから始めて、そこに行くことをお勧めします

于 2012-05-31T14:15:02.177 に答える