Was ist der beste Weg, um Konstanten in Android zu definieren, entweder statische Klasse, Schnittstelle oder XML-Ressource?

98

Ich entwickle eine Android-Anwendung, die einen Webdienst verwendet, um Daten vom Server abzurufen. Dafür habe ich drei verschiedene URLs, die auf das Entwicklungssystem, den Testserver und den Live-Server verweisen. Es ist schwierig, die URL zu ändern, wenn ich eine Anwendung zum Testen / Live geben möchte. Daher wollte ich es konfigurierbar machen, damit die Anwendung eine geeignete URL basierend auf meiner Konfigurationskonstante für den Build-Typ erhalten kann. So,

  • Was ist der beste Weg, um diese Konstanten, die statische Java-Klasse oder die öffentliche Java-Schnittstelle oder die XML-Ressourcendatei beizubehalten? Wann? Warum?
  • Was ergibt eine bessere Leistung? Wann? Warum?

Beispiel: XML-Ressource

<integer name="config_build_type">0</integer>
<string-array name="url_authentication">
    <item >http://development.com/xxxx</item>
    <item >http://test.com/xxx</item>
    <item >http://example.com/xxx</item>
</string-array>

Statische Java-Konstante

public class Config {
    public static final int BUILD_TYPE = 0; // 0 - development, 1 - test, 2 - live
    public static final String[] URL_AUTHENTICATION = {"http://development.com/", "http://test.com/", "http://example.com"};
}
Jayabal
quelle
1
Ich bezweifle sehr, dass Leistung hier ein Problem sein wird ...
Alex Lockwood
Ob Webdienstaufrufe in einer Klasse oder in mehreren Klassen erfolgen?
Venky
@venky, dass in mehreren Klassen, jede für unterschiedliche Zwecke, dh eine für die Benutzerauthentifizierung eine andere, um Daten herunterzuladen und so ..
Jayabal

Antworten:

92

Es gibt einen großen Unterschied zwischen den beiden, da Sie in Ihren XML-Layouts auf Projektressourcen verweisen können. Sie sind im Anwendungskontext verfügbar und daher für die gesamte globale Anwendung zugänglich. Die größten Vorteile der Verwendung von Projektressourcen sind der einfache Zugriff und die Möglichkeit, Ihr Projekt erheblich zu organisieren.

static finalKonstanten werden in den Java-Bytecode kompiliert; projektressourcen werden innerhalb der apk in ein binäres format kompiliert. Der Zugriff auf beide ist äußerst effizient. Wenn zwischen beiden ein Unterschied besteht, ist dies höchstens trivial.

Es gibt keine festgelegte Regel, wie Sie Ressourcen / Konstanten in Ihrem Projekt verwenden sollen. Trotzdem verwende ich persönlich Ressourcen für Werte, die ich möglicherweise in meinem XML- oder Java-Code verwenden muss. Andererseits verwende ich normalerweise static finalKonstanten für Werte, die nur von meinem Java-Code verwendet werden und für meine Implementierung spezifisch sind.

Beachten Sie auch, dass es abhängig von der aktuellen Konfiguration des Geräts (z. B. Bildschirmgröße, Gebietsschema usw.) möglich ist, XML-Ressourcen zur Laufzeit zu laden. Sie sollten dies berücksichtigen, wenn Sie entscheiden, ob Sie die Konstante in XML oder direkt in Ihren .javaDateien deklarieren möchten.

Alex Lockwood
quelle
Ressourcen sind viel einfacher in verschiedenen Varianten / Build-Typen zu konfigurieren
Hoffentlich
@Alex Ich habe einen Zweifel, können Sie es bitte klären: Es wird empfohlen, weniger statische Variablen zu verwenden. Wenn wir also eine konstante Datei mit statischen Variablen erstellen, hat dies keine Auswirkungen auf die Leistung unserer Anwendung?
Pallavi
2
Ein weiterer zu berücksichtigender Punkt ist, dass, wenn eine endgültige Konstante über mehrere Klassen hinweg verwendet wird, alle diese Objekte neu kompiliert werden müssen, wenn die Konstante geändert wird. Dies ist jedoch nicht der Fall, wenn die Konstante als Ressource gespeichert ist. Dies könnte eine wichtige Überlegung für ein großes Projekt sein, dessen Kompilierung lange dauert.
Orodbhen
23

Für die Leute, die sehen wollen, wie wir eine Klasse verwenden können, um unsere Konstanten zu definieren und jede aufzurufen, wo wir sie brauchen.

Constant.java

    package org.nrum.nrum;

/**
 * Created by rajdhami on 5/23/2017.
 */
public class Constant {
    public static final String SERVER = "http://192.168.0.100/bs.dev/nrum";
//    public static final String SERVER = "http://192.168.100.2/bs.dev/nrum";
    public static final String API_END = SERVER + "/dataProvider";
    public static final String NEWS_API = API_END + "/newsApi";
    public static final String BANNER_API = API_END + "/bannerApi/lists";
    public static final String NOTICE_API = API_END + "/noticeApi/lists";
    public static final String UPLOAD_PATH = SERVER + "/uploads";
    public static final String UPLOAD_PATH_BANNER = UPLOAD_PATH + "/company_1/banner";
    public static final String UPLOAD_PATH_NEWS = UPLOAD_PATH + "/company_1/news";
    public static final int BANNER_TRANSITION_DURATION = 5000;
    public static final int NOTICE_BUTTON_BLINK_DURATION = 5000;
    public static final int BANNER_FETCH_LIMIT = 3;
}

Jetzt können wir die obigen Konstanten folgendermaßen verwenden.

Constant.NOTICE_BUTTON_BLINK_DURATION
Mahen
quelle
1
Frage wurde nach dem besten Weg gestellt !!
Shadygoneinsane
@Umar Ich möchte verschiedene unterschiedliche Rollen verwenden Unterschiedliche unterschiedliche URL, bitte helfen Sie, vorher habe ich die gleiche wie urs verwendet
Kuldeep Singh
11

Im allgemeinen Fall:

  • XML-Werte haben den Vorteil, dass sie in der Layoutdatei und der Manifestdatei gegenüber Konstanten in der Java-Datei zugänglich sind
  • XML-Werte bieten den Vorteil einer mehrsprachigen Unterstützung gegenüber Konstanten in Java-Dateien
Dheeresh Singh
quelle
1
danke u Dheeresh, ya ich habe verstanden, es ist sehr nützlich, die Konfiguration in XML zu halten, auf die sowohl Layouts, Manifest als auch Java
zugreifen
2

Es ist immer eine gute Praxis, UI-Zeichenfolgen aus Ihrem App-Code zu extrahieren und in einer externen Datei zu speichern. Android macht dies mit einem Ressourcenverzeichnis in jedem Android-Projekt einfach.

http://developer.android.com/training/basics/supporting-devices/languages.html

Samir Mangroliya
quelle
Die Frage betrifft Konstanten, die intern nur von Java-Code verwendet werden dürfen. Es ist ein anderes Szenario. Wie Sie bereits erwähnt haben, besteht für den speziellen Fall von Text-Tags, die zur Benutzeroberfläche gehören, kein Zweifel daran, dass die XML-Ressourcen des Android-Projekts am richtigen Ort sind.
Cesargastonec
2

Ich denke, beides scheint gut zu sein, aber es hängt von Ihren Anforderungen ab.

Wenn Sie Ihre Werte (Webdienst-Link) in Ihrem XML haben und annehmen, dass sich Ihre Werte ändern (Webdienst-Link), können Sie diese nur in der XML-Datei problemlos ändern.

Wenn Sie jedoch innerhalb von Klassen statische Variablen verwenden, müssen Sie alle Klassendateien ändern.

Mein Vorschlag ist also, Konstanten von der Quelldatei zu trennen und in die Ressource zu stellen und darauf zuzugreifen.

Venky
quelle
1
"Sie können nur in XML-Dateien leicht ändern" Es ist so einfach wie das Ändern in einer Java-Datei. In beiden Fällen müssen Sie das Projekt neu erstellen. Ich denke also, das ist kein Unterschied, lassen Sie einen Vorteil beiseite.
Fran Marzoa
0

Ich bin froh, dass jemand das gefragt hat ... plus eins!

Projektressourcen benötigen Zugriff auf den Kontext, der in statischen Methoden nicht verfügbar ist (es sei denn, Sie übergeben ihn usw.), aber immer in Aktivität verfügbar ist. Es scheint eine bevorzugte Verbindung zwischen Ressourcen und Layouts zu bestehen. Für App-Variablen und Konstanten, die in statischen Methoden verarbeitet werden können, erstelle ich eine abstrakte Klasse und führe einen statischen Import (dieser Konstantenklasse) in alle anderen Projektklassendateien durch.

PVS

PVS
quelle