Comme Enums ne sont pas des types primitifs, quel est le moyen le plus efficace de passer un énumé à travers une interface AIDL à Android? Existe-t-il un moyen de convertir l'énumé en premier en premier? P>
3 Réponses :
types non primitifs, autres que
chaîne code>, nécessite un indicateur directionnel. Les indicateurs directionnels incluent
dans code>,
out code> et
inout code>. P>. blockQuote>
Jetez un coup d'œil à la documentation officielle de celle-ci: http: // développeur.android.com/guide/developing/tools/aiderl.html#aidlysyntax p>
En outre, vous pouvez envisager de transmettre la chaîne ou la représentation ordinale de l'énum et la traduire le dos en cas de besoin. Ceci est pris à partir de la Java 2e édition efficace: p>
xxx pré> dans l'affaire ci-dessus,
Opération code> est un
Enum code>. < / p>
Pour obtenir l'ordinal d'un énumé considérer cet exemple: p>
xxx pré> blockQuote>
Vous devriez également envisager d'éviter tout enums entièrement (dans un projet Android), si vous pouvez l'aider. développeur.android.com/guide/practices/design/...
Malheureusement, je n'ai pas la possibilité d'éviter les énumes; Ceci est un projet collaboratif. Puis-je extraire l'ordinal d'une valeur d'énorme?
@Charliecollins que a > Les conseils ont été repris.
J'utilise simplement
enum InitResponse implements Parcelable { // Everything is fine. SUCCESS, // Something else FOO; @Override public int describeContents() { return 0; } @Override public void writeToParcel(final Parcel dest, final int flags) { dest.writeString(name()); } public static final Creator<InitResponse> CREATOR = new Creator<InitResponse>() { @Override public InitResponse createFromParcel(final Parcel source) { return InitResponse.valueOf(source.readString()); } @Override public InitResponse[] newArray(final int size) { return new InitResponse[size]; } }; }
Je me suis maintenant terminé par la combinaison de cette approche avec la mise en œuvre de la mise en œuvre par rapport à Stackoverflow.com/questions/2836256/... entraînant le code édité ci-dessus.
Oui, vous pouvez réussir Enums via AIDL, mais vous devez mettre en œuvre la mise en œuvre de colis sur le type ENum.
1: une implémentation de modelage. P>
public enum Badges { GOLD,SILVER, BRONZE; // Must match @array/badge_states public int toInteger() { return this.ordinal(); } public static Badges fromInteger(int value) { return values()[value]); }
Jetez un coup d'œil au commentaire de Charlie Collins. C'est tout à fait vrai: évitez tout au courant que possible.
@Cristian qui doit être pris avec un grain de sel. Enums sont un bon design. Il y a une raison pour laquelle Android n'enlève pas d'énumérums de la langue.
C'est vrai mec. Cependant, je pense qu'ils ne l'ont pas déplacée parce que ce n'est pas si facile. Ils utilisent toujours
javac code> avant de dexer le bytecode. Quoi qu'il en soit ... J'adore les énumes et les utiliser quand ils rendent les choses claires et élégantes.
Enums sont parfaitement corrects dans le code de l'application. Les auteurs-cadres opèrent sous un ensemble de contraintes différents. (Comparez, par exemple, comment MFC évite les virtualités dans de nombreuses classes de base.) Pour Android spécifiquement, les premiers tests ont montré que Enums consommait beaucoup plus de mémoire que les constantes. Le framework les évite. Ymmv. En fait, votre kilométrage va varier i>, alors faites la bonne chose pour votre application plutôt que de simplement faire ce que tout le monde fait.
Quelque part dans le site Web profond, Google nous a donné le goûter à utiliser Enums dans le code Android. Quelque part dans le quartier de 600 octets pour un énumé. Et les téléphones ont parcouru un long chemin depuis Android 1.0. Fonce.