Qual è il modo migliore per definire le costanti in Android, classe statica, interfaccia o risorsa xml?


98

Sto sviluppando un'applicazione Android che utilizza il servizio Web per ottenere dati dal server, per questo ho tre diversi set di URL per indicare il sistema di sviluppo, il server di test e il server live. È difficile cambiare l'URL ogni volta che voglio dare un'applicazione per test / live. quindi ho pianificato di renderlo configurabile, in modo che l'applicazione possa ottenere l'URL appropriato in base alla costante di configurazione del tipo di build. Così,

  • qual è il modo migliore per mantenere queste costanti, classe statica java o interfaccia pubblica java o file di risorse xml.? Quando? Perché?
  • che dà prestazioni migliori ?, Quando? Perché?

Es: risorsa xml

<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>

Costante statica Java

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"};
}

1
Dubito fortemente che le prestazioni saranno un problema qui ...
Alex Lockwood,

Se le chiamate al servizio Web sono in classe singola o multipla?
Venky

@venky, che in più classi, ciascuna per scopi diversi, ovvero una per l'autenticazione dell'utente, un'altra per scaricare i dati e così ..
Jayabal,

Risposte:


92

C'è una grande differenza tra i due in quanto è possibile fare riferimento alle risorse del progetto nei layout XML. Sono disponibili nel contesto dell'applicazione e sono quindi accessibili dall'applicazione globale. I maggiori vantaggi dell'utilizzo delle risorse del progetto sono la facilità di accesso e che consentono di organizzare in modo significativo il progetto.

static finalle costanti vengono compilate nel bytecode java; le risorse del progetto sono compilate in un formato binario all'interno dell'apk. Accedere a uno dei due è estremamente efficiente ... se c'è una differenza tra i due, è al massimo banale.

Non esiste una regola fissa su come utilizzare le risorse / le costanti nel progetto. Detto questo, utilizzo personalmente le risorse per i valori che potrei aver bisogno di utilizzare nel mio codice XML o Java. D'altra parte, in genere uso static finalcostanti per i valori che verranno utilizzati solo dal mio codice java e sono specifici della mia implementazione.

Notare inoltre che è possibile caricare risorse XML in fase di esecuzione a seconda della configurazione corrente del dispositivo (ad es. Dimensioni dello schermo, impostazioni internazionali, ecc.). Quindi dovresti tenerne conto quando decidi se dichiarare o meno la costante in XML o direttamente nei tuoi .javafile.


le risorse sono molto più facili da configurare in diversi gusti / tipi di build
spera che sia utile il

@Alex Ho un dubbio, puoi chiarirlo: Si consiglia di utilizzare meno variabili statiche, quindi se creiamo file costanti con variabili statiche non influirà sulle prestazioni della nostra applicazione?
Pallavi

2
Un altro punto da considerare è che, se una costante finale viene utilizzata in più classi, tutti quegli oggetti dovranno essere ricompilati se la costante viene modificata. Ma non è così se la costante viene archiviata come risorsa. Questa potrebbe essere una considerazione importante per un progetto di grandi dimensioni che richiede molto tempo per la compilazione.
orodbhen

23

Per le persone che vogliono vedere come possiamo usare una classe per definire le nostre costanti e chiamare qualsiasi cosa di cui abbiamo bisogno.

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;
}

Ora possiamo usare le costanti sopra nel modo seguente.

Constant.NOTICE_BUTTON_BLINK_DURATION

1
La domanda è stata posta per il modo migliore !!
shadygoneinsane

@ Umar Voglio usare un ruolo diverso diverso URL diverso diverso, per favore aiuto, prima usavo lo stesso come urs
Kuldeep Singh

11

In caso generale:

  • I valori XML hanno il vantaggio di accessibilità nel file di layout e nel file manifest rispetto alle costanti nel file java
  • I valori XML hanno il vantaggio del supporto multilingue rispetto alle costanti nel file java

1
grazie Dheeresh, ho capito, è molto utile mantenere la configurazione in xml a cui si accede da entrambi i layout, manifest e java
Jayabal

2

È sempre buona norma estrarre le stringhe dell'interfaccia utente dal codice dell'app e conservarle in un file esterno. Android lo rende facile con una directory di risorse in ogni progetto Android.

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


La domanda riguarda le costanti da utilizzare internamente solo dal codice Java. È uno scenario diverso. Per il caso specifico dei tag di testo appartenenti all'interfaccia utente, come dici tu, non c'è dubbio che il posto giusto siano le risorse XML del progetto Android.
cesargastonec

2

Penso che entrambi i modi sembrino buoni, ma il fatto è che dipende dalle tue esigenze.

Se hai i tuoi valori (link al servizio web) nel tuo XML e supponi che ci sia qualche cambiamento nei tuoi valori (link al servizio web), puoi facilmente cambiare solo nel file XML.

Ma se usi classi interne come variabili statiche devi cambiare in tutti i file di classe.

Quindi il mio suggerimento è di separare le costanti dal file di origine e inserirle nella risorsa e accedervi.


1
"puoi facilmente modificare solo in file XML" È facile come cambiarlo in un file Java, e in entrambi i casi dovrai ricostruire il progetto, quindi non credo sia una differenza, tralasciando un vantaggio.
Fran Marzoa

0

Sono contento che qualcuno l'abbia chiesto ... più uno!

Le risorse del progetto devono accedere a Context, che non è disponibile nei metodi statici (a meno che non lo si passi ecc.), Ma sempre disponibile in Activity: sembra esserci una connessione preferenziale tra risorse e layout. Per le variabili e le costanti delle app che possono essere elaborate nei metodi statici creo una classe astratta e faccio un'importazione statica (di questa classe delle costanti) in tutti gli altri file della classe del progetto.

PVS

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.