1

私はこの投稿に従いますAndroid でユーザーの現在の場所を取得する最も簡単で最も堅牢な方法は何ですか?

投稿について多くの質問がありますが、残念ながらそこに返信するほどの評判がないため、別の投稿を作成する必要があります。ご不便をかけて申し訳ありません。

コードをコピーしてアプリに貼り付けると、Samsung S2 では動作しますが、エミュレーター (2.3) では動作しません。

私の質問:

  1. エミュレーターで実行すると、コードが onLocationChanged() メソッドに到達することはなく、代わりに 20 秒 (timer1 によって設定されたタイムアウト) 待機して GetLastLocation の run() を開始します。なんで?

  2. これで、GetLastLocation クラスの run() メソッドが常に呼び出され、上記の例外が発生しました。

    (E/AndroidRuntime(436): android.view.ViewRoot$CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。)

私のコードでエラーが発生すると思います:

    public LocationResult locationResult = new LocationResult()
    {
        @Override
        public void gotLocation(final Location location)
        {
            Log.i(LOG_TAG, "gotLocation");
            if (location == null)
            {
                Log.i(LOG_TAG, "Cannot get location");
            }
            else
            {
                Log.i(LOG_TAG, "Lat: " + location.getLatitude() + " Long:" + location.getLongitude());
                tv = (TextView) findViewById(R.id.my_text); // <<< error here!!!
                            tv.setText(lat + "," + lon);
            }
        }
    };

TextView tv は、MyLocation myLocation = new MyLocation();andを呼び出すメイン アクティビティで初期化されますmyLocation.getLocation(this, locationResult);。ポストと同じデザインです。別のスレッドで GetLastLocation の run() が呼び出されているのだろうか? どうしてこれなの?誰かが同じ問題を抱えていますか?

どうもありがとう!

4

1 に答える 1

1

エミュレーターを使用する場合、現在地をエミュレーターに設定する必要があります。それはいくつかの異なる方法で行うことができます。ここでそれらを参照してください。telnetテストを開始する最も簡単な方法は、 andgeoコマンドを使用することだと思います。

あなたが使用できるようfindViewByIdに、あなたは some の内部クラスにいると思いますActivity。したがって、runOnUiThreadメソッドを使用してビューを更新します。

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        tv = (TextView) findViewById(R.id.my_text); 
        tv.setText(lat + "," + lon);
    }
});

サンプル コードでは、位置の更新はタイマー タスクを介して受信されるため、別のスレッドで実行されています。

于 2012-02-20T20:18:49.100 に答える