1

我有一个应用程序已经过彻底测试,并在Android姜饼(以及较旧的Android版本)上正常工作。我从用户报告的崩溃错误中注意到,运行Android操作系统更高版本的手机正在投掷NetworkOnMainThreadExceptionGeoCoder getFromLocation方法是否会导致NetworkOnMainThreadException被抛出?

我试图通过我的代码工作,并消除/修复所有的罪魁祸首。如果从main/ui线程调用,GeoCodergetFromLocationgetFromLocationName方法会抛出NetworkOnMainThreadException

回答

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); 
相关问题