GeoCoder getFromLocation方法可以引发NetworkOnMainThreadException吗?

时间:2012-03-27 16:15:57

标签: android android-maps android-networking android-3.0-honeycomb

我有一个应用程序经过彻底测试,在Android Gingerbread(以及较旧的Android版本)上运行良好。我注意到,根据用户报告的崩溃错误,运行更高版本Android操作系统的手机正在抛出NetworkOnMainThreadException

我正在尝试处理我的代码并消除/修复所有罪魁祸首。如果从主/ ui线程调用,GeoCoder getFromLocationgetFromLocationName方法会抛出NetworkOnMainThreadException吗?

1 个答案:

答案 0 :(得分:10)

似乎这些Geocoder方法和 任何 网络或i / o调用都会引发NetworkOnMainThreadException。所以,如果有疑问,请将其粘贴在一个单独的线程中!

以下是如何从另一个线程调用GeoCoder.getFromLocation()方法的示例:

new AsyncTask<GeoPoint, Void, Address>()
{
  @Override
  protected Address doInBackground(GeoPoint... geoPoints)
  {
    try
    {
      Geocoder geoCoder = new Geocoder(context);
      double latitude = geoPoints[0].getLatitudeE6() / 1E6;
      double longitude = geoPoints[0].getLongitudeE6() / 1E6;
      List<Address> addresses = geoCoder.getFromLocation(latitude, longitude, 1);
      if (addresses.size() > 0)
        return addresses.get(0);
    }
    catch (IOException ex)
    {
      // log exception or do whatever you want to do with it!
    }
    return null;
  }

  @Override
  protected void onPostExecute(Address address)
  {
    // do whatever you want/need to do with the address found
    // remember to check first that it's not null
  }
}.execute(myGeoPoint);