no se puede llamar a String.isEmpty () en Android

80

En mi aplicación de Android no puedo usar la función String.isEmpty () que se encuentra en JDK 1.6. Android 2.1 lib no tiene esta función en la clase java.lang.String

Intenté ingresar la biblioteca del sistema JRE en mi proyecto, porque tiene esta función, pero no hubo efectos.

¿Cómo puedo resolver este problema y permitir que mi aplicación use esta función?

teoretik
fuente
11
isEmpty se agrega en el nivel de API 9. Consulte aquí developer.android.com/reference/java/lang/…
Mudassir
3
Extraño, no me he encontrado con este problema. Sin embargo, evito usar .isEmpty (). Simplemente prefiero usar if (myString == null || myString.trim (). Size () == 0)
Ali
1
@Ali - ¡¡ughh !! Parece que el código en el que trabaja está haciendo un mal trabajo al especificar y verificar sus API / interfaz precondiciones y postcondiciones.
Stephen C
Por cierto, incluso puede decirle a JavaC que compile código para que sea compatible con una versión articular de JRE. Nunca lo he probado, pero me pregunto si sería una solución más fácil en este caso. @Stephen: Nuestro arquitecto de software me ha dicho específicamente que siempre verifique si hay nulos cuando se recibe un valor de una llamada a la API. Además, con la entrada del usuario a menudo tenemos una inconsistencia donde el front-end puede devolver nulo si un campo está vacío o una cadena vacía si el usuario enfoca el campo pero no escribe nada. Extraño lo sé.
Ali
2
@Ali: no me impresiona tu arquitecto. En mi opinión, es una mejor idea detectar y tratar nulos en la fuente que en cada API. Aparte de eso, trate los nulos inesperados como errores y deje que se conviertan en NPE. El problema con la prueba explícita de nulos es que su código está repleto de comprobaciones sin sentido y puede caer en la trampa de "arreglar" los nulos convirtiéndolos en cadenas vacías (por ejemplo).
Stephen C

Respuestas:

83

¿Cómo puedo resolver este problema y permitir que mi aplicación use esta función?

No puedes.

Úselo en su String.length() == 0lugar. Es compatible con versiones anteriores desde JDK 1.0 ... y también con J2ME.

String.equals("") es otra alternativa.


¿Está seguro de que no hay forma de configurar Eclipse para poner en un código clases de bibliotecas definidas?

No, si desea que su aplicación se ejecute en un dispositivo Android real . Las plataformas Java / Android intencionalmente le dificultan jugar con el comportamiento de las bibliotecas de clases principales. Para empezar, solo puede hacerlo modificando el equivalente de Davlik de bootclasspath o rt.jararchivo, y ninguno de estos se puede hacer dentro de una JVM en ejecución.

Ese tipo de retoques tiene el riesgo de romper potencialmente Java para otras aplicaciones. Incluso suponiendo que no pueda comprometer la separación de aplicaciones de Android directamente (debido a la separación de proceso / uid que se menciona a continuación), los ajustes maliciosos en las clases centrales de Java (compartidas) podrían permitir que una aplicación interfiera o robe información de otra aplicación. .

Esteban C
fuente
El problema es que trabajo con JSONRPC, usando clases de la biblioteca gratuita code.google.com/p/json-simple y hay una función JSONRPC2Message.parse (String arg0), que usa el método String.isEmpty (), así que cuando Ejecuto mi aplicación y obtengo la excepción java.lang.noSuchMethodError. ¿Está seguro de que no hay forma de configurar Eclipse para poner en un código clases de bibliotecas definidas? Quiero decir, si quiero usar la clase String no de la biblioteca de Android 2.1, sino de la biblioteca del sistema JRE.
teoREtik
7
Json-simple es de código abierto; cree su propia versión de la biblioteca que no use String.isEmpty (). Eso es mucho más simple (y más seguro) que intentar adaptar la biblioteca de tiempo de ejecución de Android.
thoredge
Si no lo hicieran, sería trivial que una aplicación maliciosa subvierte la seguridad ; realmente lo dudo. Cada aplicación se ejecuta en un proceso de Linux separado bajo su propio uid, y la seguridad de Android no depende de las protecciones de los paquetes de Java. Si una aplicación modifica su propia copia, Stringeso no tiene ningún efecto en otras aplicaciones.
Poolie
@poolie - Está bien, pero ¿no hay un espacio aislado dentro de la "JVM" que ejecuta la aplicación? (Me resulta un poco difícil de creer que la seguridad a nivel de Linux sea la única protección que tiene contra las aplicaciones no autorizadas que se ejecutan en su teléfono Android.)
Stephen C
120

En su lugar, puede usar android.text.TextUtils.isEmpty () . Este método también verifica si la cadena es nula y ha estado disponible desde el nivel 1 de API.

if (TextUtils.isEmpty(str)) {
    Log.d(TAG, "String is empty or null!");
}
twaddington
fuente
6

este método apareció en API9, por lo que no puede usarlo antes de Android2.3

kzotin
fuente
5

Puedes usar esto TextUtils.isEmpty(str). Esto está disponible desde el nivel de API 1 o puede crear su propio método como a continuación

public boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}
Shan Xeeshi
fuente
2
Creo que esta debería ser la respuesta seleccionada. Usint TextUtils es la mejor opción. No tiene que crear su propia función para hacer lo mismo.
Genaut
Sabes que podrías haber escrito return (str == null || str.length() == 0);, ¿verdad?
Piovezan
@Piovezan sí, podemos escribir esto también
Shan Xeeshi
4

Hasta donde yo sé, Android es compatible con Java 5, por lo que no hay nada isEmpty();que pueda usar length()para simularisEmpty()

Jigar Joshi
fuente
1

"" .equals (yourString); también da el mismo comportamiento que String.isEmpty ();

Muhammad Aamir Ali
fuente
En realidad, es la mejor solución, ya que también evita una NullPointerException
Lukas
Esta no es la mejor solución, porque está creando un nuevo objeto String cada vez que desea comparar, mientras que con isEmpty está verificando nulo y longitud.
Genaut
2
@ user1422434 - No, no lo eres. Hay uno y solo un objeto que representa el literal de cadena vacío para toda la VM.
Stephen C
Pero también estoy en desacuerdo con @Lukas. Las soluciones que "previenen las NPE" son, en general, una mala idea. Una mejor idea es averiguar de dónde nullviene lo inesperado y solucionar ese problema . El "".equals(yourString)enfoque solo es una buena solución si el nullvalor de yourStringes significativo ... y esperado.
Stephen C
-4

Debe actualizar la API de Android al nivel 9, o usar String.trim().length()==0o en su String.equals("")lugar, debería funcionar para su nivel de API de Android y su versión de JDK.

Motor Bai
fuente
¿Qué? ¡La cadena " "no está vacía! ¿Por qué sugieres recortar la cuerda?
ruX
1
@ruX " ".trim()estará vacío !!! ¿Sabes eso? ¡No califiques si NO entiendes mi descripción!
Engine Bai
@Eugenie Bai String.trim().length()==0y String.equals("")devuelve resultados diferentes cuando String = " ". El segundo fragmento es correcto
ruX