1

だから私は現在の位置を取得するためのアプリケーションを作成しています。以下のコードは正常に機能しています

文字列stringAddress="";

public void getLocation(View view){
    最終的なLocationManagerlm=(LocationManager)getSystemService(LOCATION_SERVICE);

    基準kriteria=new Criteria();
    kriteria.setAccuracy(Criteria.ACCURACY_FINE);
    kriteria.setAltitudeRequired(false);
    kriteria.setBearingRequired(false);
    kriteria.setCostAllowed(true);
    kriteria.setPowerRequirement(Criteria.POWER_LOW);
    最終的な文字列プロバイダー=lm.getBestProvider(kriteria、true);

    最終的な場所lokasi=lm.getLastKnownLocation(provider);
    updateWithNewLocation(lokasi);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER、2000、5、ll);

    edittext_position.setText(stringAddress);
}

private void updateWithNewLocation(Location
    if(lokasi!= null){
        double lat = lokasi.getLatitude();
        double lng = lokasi.getLongitude();
        Geocoder gc = new Geocoder(this、Locale.getDefault());

        試す{
            リストアドレス=gc.getFromLocation(lat、lng、1);
            StringBuilder sb = new StringBuilder();

            if(addresses.size()> 0){
                アドレスアドレス=addresses.get(0);
                sb.append(address.getAddressLine(0));
                stringAddress = sb.toString();
            }

        } catch(例外e){

        }
    }
}

private final LocationListener ll = new LocationListener(){
    public void onStatusChanged(String Provider、int status、Bundle extras){

    }

    public void onProviderEnabled(文字列プロバイダー){

    }

    public void onProviderDisabled(文字列プロバイダー){
        updateWithNewLocation(null);
    }

    public void onLocationChanged(Location location){
        updateWithNewLocation(location);
    }
}

しかし、問題は、getLocation()関数を呼び出すたびに、結果を返す前にアプリケーションが数秒間ハングすることです。aSyncTaskを使用してこの問題を解決することは知っていますが、開始方法がわかりません。あなたの助けに感謝。

ありがとうございました

4

2 に答える 2

1

それは私のアプリケーションからのスニペットです:

public void getCurrentLocation(final ListenerGetCurrentLocation listenerGetCurrentLocation) {
    new AsyncTask<Void, Void, List<Address>>() {

        @Override
        protected List<Address> doInBackground(Void... voids) {
            Geocoder geo = new Geocoder(instance);

            List<Address> listAddresses = null;

            Criteria criteria = new Criteria();
            String bestProvider = locationManager.getBestProvider(criteria, true);

            if (bestProvider == null) {
                bestProvider = LocationManager.NETWORK_PROVIDER;
            }

            Location location = locationManager.getLastKnownLocation(bestProvider);

            try {
                if (location != null) {
                    listAddresses = geo.getFromLocation(location.getLatitude(), 
                                                        location.getLongitude(), 
                                                        1);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            return listAddresses;
        }

        public void onPostExecute(List<Address> listAddresses) {                
            Address _address = null;
            if ((listAddresses != null) && (listAddresses.size() > 0)) {
                _address = listAddresses.get(0);

                GeoPoint currentPosition = new GeoPoint(((int)(_address.getLatitude() * 1E6)), 
                                                        ((int)(_address.getLongitude() * 1E6)));
            }

        }

    }.execute();
}
于 2012-11-25T13:19:48.703 に答える
0

requestLocationUpdates()非同期であり、アプリをブロックしません。バックグラウンドで場所をポーリングしてから、リスナーを呼び出します。

ただし、gc.getFromLocation()はそうではありません。これはおそらくあなたの遅れの原因です

新しいを作成するAsyncTaskと、Eclipseはそれらのメソッドをオーバーライドするように提案します

@Override
protected List<String> doInBackground(String... params) {
   // this is done in the background so it won't block the UI. The return type must be set to List<String> (I think default is just String)
   return gc.getFromLocation()
}


@Override
protected void onPostExecute(List<String> adresses) {
    // called when the GC work is finished. You can now use your list of addresses and display them
}

execute()あなたの仕事を呼び出すことを忘れないでください。

于 2012-11-25T22:16:28.503 に答える