2016-04-03 54 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