2011-03-09 5 views
0

インターネットに接続してリアルタイムで緯度および経度の逆座標を行うためのアンドロイドアプリがあります。これはUIに遅れて、非同期/スレッドハンドラを使用せずに "応答しない強制終了/待機"エラーを発生させる可能性があります。AndroidでonLocationChanged(Location loc)とASyncタスクの問題

非常にうまく動作する非同期タスクを実装しました。 UI lag!)、onLocationChangedメソッド内で設定された変数(経度には緯度&に設定されています)にはアクセスできません。 私はこれをやっているクラスは、変数を渡し、逆ジオコーディングされたアドレスを含む人にSMSを送ることができる別の別のクラスにリンクされています。 しかし、doinbackgroundメソッドを使用して非同期タスクを実装して以来、私は必要なものを送信できなくなりました。私はより良い説明ができるかどうかわからない、私はサンプルコードを提供します。

public void onLocationChanged(Location loc){ mylat = loc.getLatitude(); mylong = loc.getLongitude(); }

リストアドレス= geoCoder.getFromLocation(mylat、mylong、1); // afaik、これはインターネットのことをするコードで、UIより遅れている。これをdoinbackgroundに置くとmylat &にアクセスできず、 "loc.getLatitude"は存在する "onLocationChanged"メソッドで行わなければなりません。 ListAddressコードをdoinbackgroundの外に置いておくと、すべてが機能しますが、UIは明らかに遅れます。

誰かがmylat = loc.getLatitude()を取得する最良の方法をアドバイスできます。 & mylat = loc.getLatitude(); doinbackgroundメソッドの中に?

答えて

3
  1. オーバーライドあなたのAsyncTaskのコンストラクタとは、そのクラス
  2. に変数としてmylatmylongを設定したり、直接doInBackgroundメソッドに渡します。

    ... extends AsyncTask<Double, ProgressType, ReturnType> { 
        protected ReturnType doInBackground(Double... params) { 
         mylat = params[0]; 
         mylong = params[1]; 
         List addresses = geoCoder.getFromLocation(mylat, mylong, 1); 
         ... 
        } 
        ... 
    } 
    

    execute(mylat, mylong);

+0

私はこれを試しました。エラーが発生しました。しかし、それは実行可能なように聞こえる。ここに私のコードがあります。(mylat、およびmylongはグローバルに宣言されていますが、これらのために2つの別々のgetメソッドがあるので、smsメッセージを送信する他のクラスは取得できます)http://pastebin.com/9b8Q3mFc – GrumP

+0

実行はどこで呼び出されますか? – GrumP

+1

AsyncTaskは別のクラスである必要があります。メインクラスで継承しないでください。内部クラスの例:http://pastebin.com/2F0NEbUh – red

1

AsyncTaskクラスのコンストラクタをオーバーライドして、mylatmylongをパラメータとして渡すことができます。コンストラクタでは、パラメータをAsyncTaskのメンバ変数として保存します。これを行うには、doInBackground()メソッド内でそれらにアクセスできる必要があります。

もう1つのことは、実際にロケーションリスナーが必要かどうかを考える必要があります。おそらく、LocationManagerとその方法getLastKnownLocation()は、特定の瞬間に現在の位置だけが必要な場合にも、その仕事をします。次に、doInBackground()メソッド内の現在の位置を決定することもできます。しかし、実際にあなたのニーズに合っている場合は、getLastKnownLocation()のドキュメントをお読みください。デバイスが移動するたびに更新が必要な場合は、ロケーションリスナを使用する必要があります。

+0

感謝のFloでそれを呼び出すには、はい私は、ロケーションリスナーが必要です。非同期タスクはうまく動作しますが、smsメッセージのアドレスを送信するクラスではmylat = loc.getLatitude(); (これは特別な必須メソッドonLocationChangedにあります)、smsクラスはグローバルなnull mylat/mylong変数のみを参照するように見えるので、メインクラスからmylat/mylongのgetメソッドを呼び出すときにアドレスを解決できません。 – GrumP