2016-04-03 15 views
1

Ich bin vertraut mit Android-Entwicklung und an die NetworkOnMainThreadException Ausnahme bei einem Netzwerk-Anruf auf dem UIThread verwendet. Im folgenden Fall wird die IOException ausgelöst und NetworkOnMainThreadException wird nicht ausgelöst.Android: NetworkOnMainThreadException nicht angerufen

Code:

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

ich dieses seltsame finden. Sollte die Netzwerkausnahme (die eine Laufzeitausnahme ist) nicht ausgelöst werden?

+2

Wenn 'mGeo' ein' Geocoder' ist, führen Sie die Netzwerk-E/A nicht selbst in Ihrem eigenen Prozess aus. – CommonsWare

Antwort

4

Wenn Sie die Implementierung unter link überprüfen, ist IOException die geprüfte Ausnahme und wird vom Code ausgelöst. kann helfen, Referenz I Implementierung von Link oben bin das Hinzufügen von mehr können in den Kommentaren bei der Umsetzung

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 ist eine ungeprüfte Ausnahme, da es sich Runtime diese link von Java-Dokumentation. Hoffe das beantwortet Ihre Frage.

+0

Danke ... das macht sehr viel Sinn. Es war also im Grunde nur eine API-Design-Wahl für GeoServices. Ich hatte zuvor den Eindruck, dass Android immer wusste, wann ein Netzwerkanruf stattfand, und es wurde garantiert, dass eine Laufzeitausnahme beim Aufrufprozess ausgelöst wurde. – arhoskins

+0

Ja, wie CommonsWare sagte, wenn Sie Netzwerkaufruf auf Ihrem eigenen Prozess tun, dann müssen Sie die NetworkOnMainThreadException behandeln. – RamIndani

Verwandte Themen