0

私は、インターネットに接続してリアルタイムで緯度と経度の座標で逆ジオコードを実行する Android アプリを持っています。これにより UI が遅延し、「応答していません - 強制終了/待機」エラーが発生する可能性があります (async/threads-handlers を使用しなくても予想どおり!)

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

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

/*
afaik, this is the code that does the internet stuff, that lags the 
UI.  If I put this in doinbackground, it cannot access mylat & my long, 
and the "loc.getLatitude" has to be done in the "onLocationChanged" 
method, which HAS to exist. If I leave the ListAddress code outside the 
doinbackground, everything works, BUT the UI will obviously lag.
*/
List<Address> addresses = geoCoder.getFromLocation(mylat,mylong, 1); 

mylat = loc.getLatitude(); & mylat = loc.getLatitude();doinbackground メソッド内に入る最善の方法をアドバイスできる人はいますか?

4

2 に答える 2

3
  1. AsyncTask のコンストラクターをオーバーライドし、そのクラスの変数として設定mylatしますmylong
  2. または直接 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);

于 2011-03-09T20:25:21.377 に答える
1

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

もう 1 つのことは、ロケーション リスナーが本当に必要かどうかを検討する必要があるということです。特定の瞬間にのみ現在の場所が必要な場合は、おそらくLocationManagerとそのメソッドgetLastKnownLocation()も機能します。その後、doInBackground() メソッド内で現在の位置を特定することもできます。ただし、必要に応じてgetLastKnownLocation()のドキュメントを読んでください。デバイスが移動するたびに更新が必要な場合は、ロケーション リスナーを使用する必要があります。

于 2011-03-09T20:05:01.520 に答える