1

メソッドを介して新しい場所が取得されるたびにグローバル変数を常に更新するクラス(実装をLocationService拡張)があります。ServiceLocationListeneronLocationChanged

私のランチャー活動のonCreate方法で、私はこのサービスを開始します。次に、グローバル変数から緯度と経度を取得する Web サービスを呼び出します。

これによりNullPointerException、場所のグローバル変数が得られます。サービスが別のスレッドで実行されており、まだ場所を取得していないためだと思います。

質問: サービス クラスから場所が取得された場合にのみ Web サービスを呼び出すようにするにはどうすればよいですか?

本当にありがとう。:)

4

2 に答える 2

0

YourServiceLocationOperator場所が変更されたときに登録されているすべての人に通知します。LocationOperatorシンプルなインターフェースで、メソッドを宣言しますoperate(Location)

class YourService extends Service implements LocationListener {
    private List<LocationOperator> listeners = new ArrayList<LocationOperator>();

    public List<LocationOperator> getListeners() {
            return listeners;
    }

    @Override
    public void onLocationChanged(Location location) {
            for (LocationOperator listener : listeners) {
                    listener.operate(location);
            }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
            // request location updates from `LOCATION_SERVICE`
            return Service.START_NOT_STICKY;
    }

    //...
}

メイン アクティビティからこのサービスを開始して接続する

public class MainActivity extends Activity {

    static YourService yourService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...
        Intent service = new Intent(this, YourService.class);
        startService(service);
        bindService();
    }

    // ...
}

MainActivity次に、このサービスにアクセスして登録できますLocation

public class OperatorActivity extends Activity implements LocationOperator {

    @Override
    public void onCreate(Bundle instance) {
        // ...
        MainActivity.yourService.getListeners().add(this);
        // ...
    }

    public void operate(Location location) {
        // use location
    }
} 
于 2012-12-10T21:11:54.850 に答える
0

アクティビティが開始できないため、それを待つのは良くないと思います(無駄な時間によって異なります)が、次の簡単なコードで試すことができます:

While(latitude == null);
use latitude and longitude
continue with oncreate...

しかし、私のアドバイスは、アクティブな待機を行わないように、他の AsyncTask で確認することです。お役に立てば幸いです。

于 2012-12-08T23:59:09.937 に答える