2015-09-05 4 views
6

Ist context.getSystemService() ein teurer Anruf?Ist context.getSystemService() ein teurer Aufruf?

I.e. Ich habe eine kleine http-Netzwerkbibliothek gebaut (ich weiß, dass es andere http-Netzwerkbibliotheken gibt), die ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); verwendet, um zu überprüfen (vor dem Ausführen einer HTTP-Anfrage), ob der Benutzer mit dem Internet verbunden ist (Art der schnellen Strategie).

Meine Frage ist, sollte ich spare den ConnectivityManager als Instanzvariable (Klasse-Feld) meiner http Bibliothek oder sollte ich anrufen ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); jedes Mal, bevor ich eine HTTP-Anfrage starten eine „neue“ ConnectivityManager abzurufen? Wird dieselbe ConnectivityManager-Instanz jedes Mal zurückgegeben, wenn ich getSystemService(Context.CONNECTIVITY_SERVICE) aufruft (mit anderen Worten, kann das Speichern eines ConnectivityManger in einem Klassenfeld zu Problemen führen, da meine http-Bibliothek eine lange ist -> lebt solange die Anwendung läuft)

Antwort

5

Meine Frage ist, sollte ich den ConnectivityManager als Instanzvariable (Klassenfeld) meiner http-Bibliothek speichern oder ConnectivityManager aufrufen cm = (ConnectivityManager) context.getSystemService (Context.CONNECTIVITY_SERVICE); jedes Mal, bevor ich eine HTTP-Anfrage zum Abrufen eines "neuen" ConnectivityManagers starte?

Ich würde die Instanz festhalten. Während getSystemService() in der Praxis nicht so teuer zu nennen ist, warum sollte man es häufiger anrufen als nötig?

in anderen Worten, eine ConnectivityManger in ein Klassenfeld zu Problemen führen zu speichern, da meine http Bibliothek ein lange lebt ein -> solange Anwendungslauf lebt

auf Nummer sicher zu sein, Seite, Anruf getSystemService() auf dem Application singleton (getApplicationContext()). Normalerweise, das von getSystemService() zurückgegebene Objekt weiß nichts über die Context, die es erstellt hat. Gelegentlich, es tut — CameraManager in Android 5.0 litt unter diesem Fehler, obwohl das in Android 5.1 behoben wurde. Wenn das Systemdienstobjekt den Kontext, in dem ich mich befinde, überlebt, tendiere ich dazu, getApplicationContext() zu verwenden, um den Systemdienst aus Paranoia abzurufen.

(die Speicherlecks, sind sie mich raus!)

die gleiche ConnectivityManager Instanz jedes Mal zurück Ist ich getSystemService (Context.CONNECTIVITY_SERVICE) zu sein, um

nennen Ehrlich, ich habe noch nie geschaut.