Может ли метод GeoCoder getFromLocation вызвать исключение NetworkOnMainThreadException? - PullRequest
1 голос
/ 27 марта 2012

У меня есть приложение, которое было тщательно протестировано и отлично работает на Android Gingerbread (и более старых версиях Android). Я заметил по сообщениям пользователей об ошибках сбоя, что телефоны с более поздними версиями операционной системы Android выдают NetworkOnMainThreadException.

Я пытаюсь проработать мой код и устранить / исправить всех виновников. Методы GeoCoder getFromLocation и getFromLocationName выдают NetworkOnMainThreadException при вызове из потока main / ui?

1 Ответ

11 голосов
/ 04 апреля 2012

Похоже, что эти Geocoder методы и любые сетевые вызовы или вызовы ввода / вывода будут выбрасывать 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);
...