2016-04-03 51 views
1

我熟悉Android开发,并习惯于在UIThread上进行网络调用时的NetworkOnMainThreadException异常。Android:NetworkOnMainThreadException不叫

但是,在下列情况下抛出IOException,并且不会引发NetworkOnMainThreadException

代码:

 try { 
      a = mGeo.getFromLocationName("SFO", 1); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

我觉得这很奇怪。不应该抛出网络异常(这是一个运行时异常)吗?

+2

如果'mGeo'是一个'Geocoder',那么你在自己的过程中并不是自己做网络I/O。 – CommonsWare

回答

4

如果您检查link上的实现,则IOException是检查的异常,并从代码中抛出。 参考我从上面的链接更增加实现可以在注释中找到实施

public List<Address> getFromLocationName(String locationName, int maxResults) throws IOException { 
if (locationName == null) { 
    throw new IllegalArgumentException("locationName == null"); 
} 
try { 
    List<Address> results = new ArrayList<Address>(); 
    String ex = mService.getFromLocationName(locationName, 
     0, 0, 0, 0, maxResults, mParams, results); 
    if (ex != null) { 
     throw new IOException(ex); 
    } else { 
     return results; 
    } 
} catch (RemoteException e) { 
    Log.e(TAG, "getFromLocationName: got RemoteException", e); 
    return null; 
} 
} 

NetworkOnMainThreadException是一个未经检查的异常,因为它从Java文档扩展RuntimeException的这个link可能会有帮助。 希望这回答你的问题。

+0

谢谢......这很有道理。所以它基本上只是GeoServices的API设计选择。我以前的印象是,Android总是知道网络调用何时发生,并保证在调用过程中抛出运行时异常。 – arhoskins

+0

是的,正如CommonsWare所说,如果你正在自己的进程上进行网络调用,那么你需要处理NetworkOnMainThreadException。 – RamIndani