Comment faire pour récupérer un contexte de non-activité de la classe?
J'ai trouvé une réponse qui s'affiche pour dire que je doit créer une classe à part et de faire un statique MyApplication de l'objet et de faire une méthode get. Toute classe peut appeler MyApplication.get() pour récupérer le contexte.
Est-il un autre moyen le plus propre? C'est ma situation:
J'ai une classe A et de classe B. Classe contient un objet de la classe B (appelons l'objet b). Dans la catégorie que j'appelle, "b.play()". Cependant, j'obtiens une exception de pointeur null parce que la classe B doit passer un contexte pour le lecteur multimédia.méthode create ().
Jusqu'à maintenant, j'ai jeté un hack et de classe que j'ai appelé.... "b.jouer(ce)" et tout simplement passé le contexte de B. mais c'est assez moche et ressemble à une mauvaise utilisation de la programmation orientée objet.
Toute pensée?
OriginalL'auteur | 2011-07-28
Vous devez vous connecter pour publier un commentaire.
Si la classe B nécessite un Contexte de fonctionner, alors je ne vois pas de problème à avoir Une classe qui fournissent (par le biais d'un paramètre à la méthode de la pièce, un paramètre dans un constructeur, etc).
Je ne pense pas que vous faites tous les pauvres de la programmation orientée objet en fournissant de la classe B les dépendances dont il a besoin pour faire son travail.
C'est effectivement très bon OO et facilite les tests. L'injection de dépendance est une commune modèle de conception.
En passant Contexte du constructeur est préféré par opposition à passer pour chaque méthode dans une classe, puisque le passage à une méthode de classe, parfois, pourrait entraîner une NullPointerException.
OriginalL'auteur Brian Yarger
Ce problème semble survenir beaucoup dans le développement Android. Une seule solution pour obtenir une référence à un Contexte spécifique est sous-classement de la Demande et de saisir une référence au Contexte qui vous voulez.
Cette solution nécessite toutefois de spécifier le nom de votre sous-classe dans votre manifeste.
Vous pouvez ensuite utiliser n'importe où dans votre application comme cela non-classes d'activité.
Il devrait être possible depuis le unintialized de la valeur de référence est juste nul mais sinon, la variable doit, comme vous le dites, être déclarée statique. 🙂
Et un contexte statique doit être évitée en raison de sa fuite de mémoire potentiels.
Quelle est votre solution ?
passer une
Context
(peut-être votre activité ou le contexte de l'application par exemple) à votre non-activité de la classe par le biais de son constructeur. Si vous avez besoin de vous assurer que vous travaillez avec le contexte de l'application appelez simplementcontext.getApplicationContext()
à l'intérieur de votre constructeur.OriginalL'auteur Entalpi
Passant
this
autour est un moyen viable de faire les choses, surtout sithis
est l'activité qui crée l'objet dans le besoin d'un Contexte. Parfois, je vais mettre le Contexte dans le constructeur (commepublic MyObject(Context context){this.context = context;}
), de sorte que vous n'avez pas besoin de l'envoyer à tous les temps. Toutefois, si votre objet est partagé entre plusieurs Activités, vous devriez probablement mettre à jour le contexte, il est à la recherche de la nouvelle Activité, bien que je n'ai pas testé ce qui se passe si vous utilisez l'ancienne activité.I'll put the Context into the constructor [and then save it]
C'est un excellent moyen de provoquer une fuite de mémoire.though I haven't tested what happens if you use the old activity.
Presque certainement une exception sera levée, et vous serez d'avoir fui un contexte.Donc, en passant à travers la méthode est la meilleure? Comment sur les frais généraux impliqués dans le passage d'un contexte à plusieurs reprises?
Ah, oui. Vous devez définir le contexte null lorsque vous avez l'intention de le fermer, juste pour être sûr, si inaccessible des boucles fermées de références sont des candidats pour la collecte des ordures de toute façon.
Il n'y a pratiquement 0 frais généraux dans le passage d'un objet à un objet. Si votre objet de son cycle de vie est lié au cycle de vie du cadre, puis en passant, il est très bien. Mais méfiez-vous cependant, vous avez maintenant le potentiel de fuite d'un contexte.
inaccessible des boucles fermées de références sont des candidats pour la collecte des ordures de toute façon Le garbage collector n'est pas intelligent. Les contextes sont extrêmement complexes des objets. C'est vrai qu'ils devraient finalement être nettoyée. Cependant ils ont le plus probablement ne sera pas à cause des contextes très spécifiques du cycle de vie et sont détenus dans divers lieux que le GC ne pouvez pas vérifier.
OriginalL'auteur AlbeyAmakiir
J'ai répondu aussi ici.
Vous pouvez le faire en utilisant
ContextWrapper
, comme décrit ici.Par exemple:
MyContextWrapper
? J'ai besoin de passer unContext
pour ce qui est de ce que je suis après à la première place.OriginalL'auteur ET-CS