Pregunta ¿Cuál es la mejor manera de definir constantes en android, ya sea clase estática, interfaz o recurso xml?


Estoy desarrollando una aplicación para Android que utiliza el servicio web para obtener datos del servidor, para eso tengo tres conjuntos diferentes de URL para señalar el sistema de desarrollo, el servidor de prueba y el servidor en vivo. Es difícil cambiar la URL cada vez que deseo dar una aplicación para probar / en vivo. así que planeé hacerlo como configurable, para que la aplicación pueda obtener la URL adecuada en función de la constante de configuración del tipo de compilación. Asi que,

  • que es la mejor manera de mantener estas constantes, clase estática java o interfaz pública de java o archivo de recursos xml. ¿Cuando? ¿Por qué?
  • que da mejor rendimiento? ¿Cuando? ¿Por qué?

Ej: recurso 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>

Constante estática de 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"};
}

74
2018-06-22 05:38


origen


Respuestas:


Hay una gran diferencia entre los dos en cuanto a que puede hacer referencia a los recursos del proyecto en sus diseños XML. Están disponibles en el contexto de la aplicación y, por lo tanto, están disponibles en toda la aplicación global. Las mayores ventajas de utilizar los recursos del proyecto es la facilidad de acceso y que le permiten organizar su proyecto de manera significativa.

static final las constantes se compilan en el bytecode java; los recursos del proyecto se compilan en un formato binario dentro de la aplicación. El acceso a cualquiera de ellos es extremadamente eficiente ... si hay una diferencia entre los dos, es trivial como máximo.

No hay una regla establecida sobre cómo debe usar recursos / constantes en su proyecto. Dicho esto, personalmente uso recursos para valores que podría necesitar usar en mi XML o código java Por otro lado, normalmente uso static final constantes para valores que solamente ser utilizado por mi código de Java y son específicos de mi implementación.

También tenga en cuenta que es posible cargar recursos XML en tiempo de ejecución dependiendo de la configuración actual del dispositivo (es decir, tamaño de pantalla, configuración regional, etc.). Por lo tanto, debe tener esto en cuenta al decidir si debe declarar la constante en XML o directamente en su .java archivos.


74
2018-06-22 06:04



En el caso general:

  • Los valores XML tienen la ventaja de la accesibilidad en el archivo de diseño y el archivo de manifiesto en Constantes en el archivo java
  • Los valores XML tienen la ventaja de admitir varios idiomas en Constantes en el archivo java

8
2018-06-22 05:45



Para las personas que quieren ver cómo podemos usar una Clase para definir nuestras constantes y llamar a cualquier parte que necesitemos.

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

Ahora podemos usar las constantes anteriores de la siguiente manera.

Constant.NOTICE_BUTTON_BLINK_DURATION

8
2018-05-25 05:32



Siempre es una buena práctica extraer cadenas de interfaz de usuario del código de la aplicación y mantenerlas en un archivo externo. Android lo hace fácil con un directorio de recursos en cada proyecto de Android.

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


1
2018-06-22 06:27



Creo que en ambos sentidos parece ser bueno, pero la cosa es que depende de tus requisitos.

Si tiene sus valores (enlace del servicio web) en su XML y supone que hay algún cambio en sus valores (enlace del servicio web), puede cambiar fácilmente solo en un archivo XML.

Pero si usa las clases internas como variables estáticas, debe cambiarlas en todos los archivos de la clase.

Así que mi sugerencia es que se separen las constantes del archivo fuente y poner en el recurso y acceder a él ..


1
2018-06-22 06:36



No creo que va a importar mucho para el rendimiento, para ser honesto. Principalmente se trata de preferencia (prefiero usar una variable estática en el código).

Probablemente sea la mejor forma de hacerlo, ya que no es necesario leerlos desde XML, pero no hay forma de que sea una diferencia notable. Repito, no notarás la diferencia.


0
2018-06-22 05:47



Me alegra que alguien haya preguntado esto ... ¡más uno!

Los recursos del proyecto necesitan acceso a Contexto, que no está disponible en métodos estáticos (a menos que lo transfiera, etc.), pero siempre está disponible en la Actividad: parece haber una conexión preferencial entre los recursos y los diseños. Para las variables y constantes de la aplicación que pueden procesarse en métodos estáticos, creo una clase abstracta y realizo una importación estática (de esta clase de constantes) en todos los demás archivos de clase de proyecto.

PVS


0
2017-11-28 16:44