Comment sérialiser la valeur nulle lors de l'utilisation de l'interface Partagable

En ce qui concerne mon exemple de code, quelle est ma propriété si les variables de Locable sont nulles? Par exemple, maintenant si l.getZoom () renvoie null, j'ai obtenu NullPointerException.

@Override public void writeToParcel(Parcel parcel, int arg1) { parcel.writeInt(count); for(Locable l:locableArr){ parcel.writeInt(l.getOriginId()); parcel.writeInt(l.getLocableType()); parcel.writeInt(l.getZoom()); parcel.writeDouble(l.getLatituda()); parcel.writeDouble(l.getLongituda()); parcel.writeString(l.getTitle()); parcel.writeString(l.getSnipet()); } } 

Merci!

  • Comment savoir si je suis en communication avec Android?
  • Android M - vérifier l'autorisation d'exécution - comment déterminer si l'utilisateur a vérifié "Ne jamais demander à nouveau"?
  • Ajouter / Supprimer des pages à ViewPager dynamiquement
  • Comment obtenir les extras de l'intention si l'activité est «singleTask»?
  • Problèmes avec EditText et soft keyboard dans un fragment
  • Java android: ajout d'une nouvelle ligne à l'aide de TextView
  • Comment revenir au style par défaut sur EditText si j'applique un fond d'écran?
  • Android Gradle: les divisions d'utilisation ne sont-elles possibles que pour la version possible?
  • Nexus 7 ne s'affiche pas sous 'adb devices' avec Windows 8 PC
  • Android Studio 'Ajouter en tant que bibliothèque' manquant pour Universal Tween Engine sur Libgdx
  • Comment jouer gif dans Android depuis url?
  • Comment obtenir la couleur Pixel dans Android?
  • 4 Solutions collect form web for “Comment sérialiser la valeur nulle lors de l'utilisation de l'interface Partagable”

    Vous pouvez utiliser Parcel.writeValue pour Parcel.writeValue objet générique avec une valeur nulle.

    La plupart des codes de sérialisation que j'ai vus utilisent soit des indicateurs pour indiquer la présence ou l'absence d'une valeur OU précède la valeur avec un champ de comptage (par exemple, lors de la rédaction de tableaux) où le champ de comptage est mis à zéro si la valeur ne fonctionne pas T existe du tout.

    L'examen du code source des classes centrales Android révèle un code comme celui-ci (de la classe Message):

      if (obj != null) { try { Parcelable p = (Parcelable)obj; dest.writeInt(1); dest.writeParcelable(p, flags); } catch (ClassCastException e) { throw new RuntimeException( "Can't marshal non-Parcelable objects across processes."); } } else { dest.writeInt(0); } 

    Ou ceci (de la classe Intent):

      if (mCategories != null) { out.writeInt(mCategories.size()); for (String category : mCategories) { out.writeString(category); } } else { out.writeInt(0); } 

    Ma suggestion: dans votre code, s'il n'y a pas de différence fonctionnelle entre "zoom == null" et "zoom == 0", alors je déclarerais simplement le zoom comme primitif ( int au lieu d' Integer ) OU l'initialiser à zéro dans le Constructeur et assurez-vous que vous ne le mettez jamais à la valeur nulle (vous pouvez vous garantir qu'il ne sera jamais nul et que vous ne devrez pas ajouter un code spécial pour traiter cela dans vos méthodes de sérialisation / désérialisation).

    C'est la solution pour laquelle je suis venu pour écrire des cordes en toute sécurité:

     private void writeStringToParcel(Parcel p, String s) { p.writeByte((byte)(s != null ? 1 : 0)); p.writeString(s); } private String readStringFromParcel(Parcel p) { boolean isPresent = p.readByte() == 1; return isPresent ? p.readString() : null; } 

    J'utilise une classe Parcelable qui comprend également Boolean champs Integer et Boolean , et ces champs peuvent être nuls.

    J'ai eu du mal à utiliser la méthode générique Parcel.writeValue , en particulier lorsque j'essayais de la relire via Parcel.readValue . J'ai continué à obtenir une exception d'exécution qui a déclaré qu'il ne pouvait pas comprendre le type de l'objet partagé.

    En fin de compte, j'ai pu résoudre le problème en utilisant Parcel.writeSerializable et Parcel.readSerializable avec un type cast, car Integer et Boolean implémentent l'interface Serializable. Les méthodes de lecture et d'écriture gèrent null valeurs null pour vous.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.