Passer de l'Objet de référence dans l'Intention sans implémenter Serializable ou Parcelable
Je sais que des questions similaires ont été posées à plusieurs reprises. Je pense que j'ai lu la plupart des. Mais aucune réponse n'est applicable.
J'ai besoin de passer des Objets complexes par les Intentions (de l'Activité des appels/Émissions). Tout est fait dans mon processus. C'est pourquoi je ne vois aucune raison d'écrire mes objets dans les cours d'eau juste à remonter quelques millisecondes après. Je veux passer ma référence de l'objet par le biais de mon application. Est-il possible de le faire.
Depuis ma demande de diffuser le même Cas plusieurs fois dans une ligne, je ne peux pas compter sur les membres statiques. J'ai besoin d'obtenir exactement le même objet pour ce que j'ai diffusé.
C'est pourquoi je pensais à une statique "Referenceholder" qui accepte un Objet et retourne un entier qui identifie cet objet dans sa liste interne afin que je puisse passer cet entier via .putExtras. Mais autant que je sache, Java, je ne pouvais pas nettoyer cet Objet à partir de cette liste après qu'il a été ajouté parce que plusieurs Auditeurs pourrait être intéressé dans le même objet et il faudrait que je le garde dans mon Referenceholder pour toujours (en supposant qu'un thread peut être repris à tout moment - même 2 minutes plus tard).
Des idées? Suis-je en train de faire quelque chose de mal? Ou des idées de comment je peux nettoyer mon referneces (probablement après quelques secondes? cela peut conduire à un accident mais il semble de plus en plus applicable que d'écrire du code qui assemble et rassemble mes objets pour aucune raison)
OriginalL'auteur Chris | 2013-02-17
Vous devez vous connecter pour publier un commentaire.
Vos options sont assez clairs: Il n'y a pas de moyen de passer des nations unies marshallable objet (Parcelable, Serializable) dans une Intention. Arrêt complet.
Ce que vous pourriez être en mesure de faire est de passer à quelque chose qui est une référence à une liste non-marshallable objet. L'idée est que vous pouvez faire quelque chose sur l'ordre de passage d'une clé à une carte avec des cartes qui touche à la valeur que vous souhaitez adopter. Si l'Intention de l'expéditeur et de l'intention du destinataire avoir accès à la carte, vous pouvez communiquer une référence à l'onu-marshallable objet.
Je ne comprends pas exactement pourquoi vous pensez que les membres statiques ne sont pas ce que vous voulez. Je suppose qu'une statique de la carte, dans une Application personnalisée objet, seraient à peu près exactement ce que vous voulez. ... et je soupçonne, à partir de votre commentaire à propos de WeakHashMaps, que vous avez découvert exactement qui.
... sauf que rien de ce que vous avez dit jusqu'à présent explique pourquoi vous voulez faire de votre carte Faible. Avant d'utiliser une Faible carte, regardez Doux références, assurez-vous que ce n'est pas ce que tu veux dire.
Bonne chance
Désolé, je ne comprends pas pourquoi vous ne pouvez pas utiliser une variable statique de passer une référence d'objet d'une activité à une autre. Il n'y a pas de danger de fuite de mémoire ici, si ActivityA ne
Globals.object = objectIWantToPass;
et puisActivityB.onCreate()
neObject myObject = Globals.object; Globals.object = null;
Parce que c'est un horrible solution. C'est la même raison pourquoi vous passer des objets par référence et non par un membre statique de la classe. Je considérer une activité comme une fonction qui fait quelque chose avec les données que je passe en elle et qui sera de retour à un certain point et, dans certains cas, vous donner quelques données à l'appelant. Mais il semble que c'est le seul moyen...
Sachez que si vous utilisez une faiblesse de la carte et la seule "référence" à l'objet est la carte clé que vous passez dans l'intention, le GC peut collecter de l'objet alors que vous êtes de passage. ...et je ne comprends pas pourquoi vous considérez statique dans l'application "horrible".
horrible parce que l'état global est considéré comme une mauvaise conception?
OriginalL'auteur G. Blake Meike
EDIT:
Oublier cette solution. Il ne fonctionne pas. Android est l'adaptation de l'Intention que vous avez passé .startActivity(). Il n'y a aucun moyen d'obtenir toute référence à l'intérieur d'une activité. C'est - à mon avis - grand bu****t mon par google. Vous devez appeler votre activité et le lieu de la referneces de votre objet dans les membres statiques...
Comme dessus décrite par G. Blake Meike, il n'y a pas de moyen de passer des références d'Objets dans Android via Intentions. Mais vous peut-être pouvez utiliser WeakReferences.
Un très excellent aticle sur ce sujet se trouve ici:
http://weblogs.java.net/blog/2006/05/04/understanding-weak-references
Je suis arrivé à cette solution par le biais de cette question:
Est-il possible d'obtenir l'objet de comptage de référence?
Donc ce que je suis fondamentalement va faire:
Je vais utiliser les Intentions comme une Clé pour un WeakHashMap et passer mon Objet comme valeur. Cela semble être le seul Objet qui convient à la Clé, puisque tout ce que vous mettez dans les Intentions extras seront sérialisés. De ce fait, vous ne pouvez passer un Objet par l'Intention. Vous pourriez mettre en œuvre des sous-classes à l'intérieur de votre Acitivité qui peuvent contenir vos Objets mis cette sous-classe dans la carte à la place. Mais je ne suis toujours pas sûr si l'Intention de l'objet qu'un récepteur est le même que l'appelant a créé mais je pense que oui. Si elle n'est pas, je vais modifier cette solution (ou peut-être quelqu'un pourrait éclaircir ce point).
WeakReference
fonctionne. LeSerializable
/Parcelable
exigence implique qu'il y a une profonde exigence sous-jacente de l'objet est profonde copié à partir d'un endroit à l'autre. Cela implique que toute forme de référence en passant ne marchera pas, par exemple, parce que nous parlons de mémoire différents espaces d'adressage. Et même s'il ne le travail, la justification doit être que le partage de la référence entre les instances d'une application est mauvais pour d'autres raisons.Vous êtes de droite. Je l'ai testé. Le but de l'activité reçoit n'est pas la même que j'ai créé.
Puis-je transmettre les références de l'Objet dans une Intention envoyé à l'aide de LocalBroadcastManager si j'ai un Parcelable emballage?
OriginalL'auteur Chris