当前位置: 首页 > 知识库问答 >
问题:

使用地理编码器检索基于纬度和经度的地址会造成滞后。Android系统

闾丘选
2023-03-14

我有一个map活动,上面还有一个EditText,每当地图上有拖动时,我想在EditText中显示不断变化的地址。我目前正在使用Geocoder类根据地图提供的坐标检索地址。但是这种方式在地图的流畅拖动运动中造成了很大的滞后性。是否有更好的方法检索地址或更高效的方法使用Geocoder类?现在,我已经在地图的OnCameraChangeListener事件中实现了getAddress()方法。这是密码。

mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition cameraPosition) {
                double latitude=mMap.getCameraPosition().target.latitude;
                double longitude=mMap.getCameraPosition().target.longitude;
                String _Location="";
                Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
                try {
                    List<Address> listAddresses = geocoder.getFromLocation(latitude, longitude, 1);
                    if(null!=listAddresses&&listAddresses.size()>0){
                        _Location = listAddresses.get(0).getAddressLine(0);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                EditText addressTxt=(EditText) findViewById(R.id.search_address_txt);
                addressTxt.setText(_Location);
            }
        });

共有1个答案

莘欣怿
2023-03-14

geocoder$GetFromLocation()是一个阻塞调用,这意味着它将冻结UI线程,直到api返回地址。唯一的解决方案是在后台线程上运行此调用。

有两种方法可以实现这一点:

  1. 使用Google推荐的方式--使用意向服务。您可以在这里找到如何操作的详细信息。我个人觉得这是矫枉过正,非常复杂。
  2. 使用AsyncTask。查看此图可获得总体思路,并根据您的需要实施。

更新:我从我的一个旧项目中提取了这段代码,看看是否有用。

AsyncGeocoderObject.java // object to pass to asynctask

public class AsyncGeocoderObject {

    public Location location; // location to get address from
    Geocoder geocoder; // the geocoder
    TextView textView; // textview to update text

    public AsyncGeocoderObject(Geocoder geocoder, Location location, TextView textView) {
        this.geocoder = geocoder;
        this.location = location;
        this.textView = textView;
    }
}


AsyncTask实现

public class AsyncGeocoder extends AsyncTask<AsyncGeocoderObject, Void, List<Address>> {

private TextView textView;

@Override
protected List<Address> doInBackground(AsyncGeocoderObject... asyncGeocoderObjects) {
    List<Address> addresses = null;
    AsyncGeocoderObject asyncGeocoderObject = asyncGeocoderObjects[0];
    textView = asyncGeocoderObject.textView;
    try {
        addresses = asyncGeocoderObject.geocoder.getFromLocation(asyncGeocoderObject.location.getLatitude(),
                asyncGeocoderObject.location.getLongitude(), 1);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return addresses;
}

@Override
protected void onPostExecute(List<Address> addresses) {
    Log.v("onPostExecute", "location: " + addresses);
    String address;
    if (addresses != null)
        address = addresses.get(0).getLocality() + ", " + addresses.get(0).getCountryName();
    else address = "Service unavailable.";
    textView.setText(address);
}
}

在位置更改时调用方法:

new AsyncGeocoder().execute(new AsyncGeocoderObject(
                new Geocoder(this),
                location,
                locationTV
        ));

>

  • 创建新类AsyncGeocoderObject并复制内容
  • 创建另一个类(可以是活动中的子类,也可以是其他java文件中的子类)AsyncGeocoder并复制内容。
  • 现在,假设您希望在mainactivity中获取用户的位置,并在textview中显示地址,例如LocationTV。实例化textview之后,创建AsyncGeocoder的新对象并传入参数。例如:

    // in onCreate()
    new AsyncGeocoder().execute(new AsyncGeocoderObject(
            new Geocoder(this), // the geocoder object to get address
            location, // location object, 
            locationTV // the textview to set address on
    )); 
    

    此外,如果您没有location对象,请使用您拥有的纬度和经度创建。请参阅此帖子了解如何。

    希望这对你有帮助!

  •  类似资料:
    • 本文向大家介绍基于python实现地址和经纬度转换,包括了基于python实现地址和经纬度转换的使用技巧和注意事项,需要的朋友参考一下 中文领域: 指的是提取境内地址的经纬度,的主要调用的是百度API。中间经历了一些波折,刚开始直接使用网上代码debug半天都不行,才发现要随时跟进官方改动,使用别人的API一定要看说明书啊! 首先需要从百度地图平台上注册一个AK(在这之前要注册百度的开发者身份,免

    • 本文向大家介绍Android编程获取地理位置的经度和纬度实例,包括了Android编程获取地理位置的经度和纬度实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android编程获取地理位置的经度和纬度。分享给大家供大家参考,具体如下: 在Android应用程序中,可以使用LocationManager来获取移动设备所在的地理位置信息。看如下实例:新建android应用程序TestLoc

    • 本文向大家介绍使用百度地图api实现根据地址查询经纬度,包括了使用百度地图api实现根据地址查询经纬度的使用技巧和注意事项,需要的朋友参考一下 以上就是代码的全部内容了,小伙伴们可以直接使用在项目中哦,不用跟我说谢谢,请叫我雷锋大大~

    • 问题内容: 我听说可以提交一个地址而不是经度和纬度,这对于我的系统来说将更加可行。用户在创建个人资料时必须输入他们的地址,之后他们的个人资料将显示其房屋的Google地图。我目前可以将Google Maps API与经度和纬度完美配合使用: 请有人帮我修改代码,以便它使Google Maps API可以在其位置请求地址,因为我想直接从mySQL数据库中读取用户的地址。 问题答案: 使用Google

    • 问题内容: 给定纬度和经度,我们如何使用Javascript或Python将其转换为街道地址? 问题答案: 大多数人在99%的时间内将您链接到Google Maps的API。不错的答案。但是- 注意禁止用途,使用限制和使用条款!尽管许多分布式应用程序并未违反使用限制,但对于Web应用程序而言却是相当有限的。TOS不允许您将皮肤上的数据重新用于Google应用程序中。您不希望因Google发出的终止

    • 本文向大家介绍JS使用百度地图API自动获取地址和经纬度操作示例,包括了JS使用百度地图API自动获取地址和经纬度操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS使用百度地图API自动获取地址和经纬度操作。分享给大家供大家参考,具体如下: 在实际工作中我们经常会遇到这样的问题,但是当我们去看百度API的时候往往又达不到我们的要求。 故此,本篇博文讲述如何使用百度地图API自动获