2012-02-20 4 views
1

私はポストについて多くの質問を持っているが、残念ながら、私は十分に持っていないこのポストにWhat is the simplest and most robust way to get the user's current location on Android?AndroidのGPS位置ヒョードルの道 - 「ビュー階層を作成しただけ元のスレッドがその見解に触れることができる」

に従ってください私は別の投稿を作成する必要があります。ご不便をかけて申し訳ありません。

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

私の質問:エミュレータで実行する場合

  1. 、コードがonLocationChanged()メソッドに到達することはありません、代わりにそれは(実行を開始する(タイムアウトはタイマ1によって設定された)20秒間待機します)のGetLastLocation。どうして?

  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テレビがMyLocation myLocation = new MyLocation();myLocation.getLocation(this, locationResult);を呼び出して、私のメインの活動に初期化されます。デザインはポストのデザインと同じです。私はGetLastLocationのrun()が別のスレッドで呼び出されたのだろうか?どうしてこれなの?誰も同じ問題を抱えていますか?

ありがとうございます!

+1

uiコンポーネントの更新は、UIスレッドで行う必要があります。 asynctaskまたはハンドラを使用して、現在のバックグラウンドスレッドからUIスレッドに移動することができます。 –

答えて

1

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

あなたがfindViewByIdを使用できるように、私はあなたがいくつかのActivityの内部クラスにいると思います。だから、あなたのビューのサンプルコードで

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

を更新するために runOnUiThreadメソッドを使用して、位置情報の更新は、それが別のスレッドで実行されている理由です、タイマータスクを介して受信されています。

+0

クイック返信ありがとう!はい、runOnUIThreadが修正のようです! 私はその記事のコメントを読んでいるので、誰もそのスレッドに関する問題はなく、誰もが自分の場所をonLocationChanged()で取得し、GetLastLocation呼び出し(質問1)にフォールバックしないようです。 run()が実行されても、位置の戻り値はnullのままです。つまり、コードlocationResult.gotLocation(null)の最後の行に到達します。私がデバッグするとき。 これにはより良いアプローチがありますか? – Caten

+0

エミュレータのせいだと思います。指定した方法であなたの場所を模擬しようとしてください。 – Olegas

+0

私はその問題だけで8時間を費やし、エミュレータ2.3のバグだと誰かが知っていることを知りました。私は自分のプロジェクトをコンパイルし、2.1で動かして地理的修正を得ることができます。スレッドの問題では、誰かがasynctaskやハンドルを使ってUIの処理を行うと言いました。したがって、runUiThread、AsyncTask、Handleの違いは何ですか?申し訳ありません。私はAndroid開発の初心者です。 – Caten

関連する問題