Ai-je besoin de copier des objets statiques si je veux y accéder à partir d'un AsyncTask?

StackOverflow https://stackoverflow.com/questions/4079556

  •  28-09-2019
  •  | 
  •  

Question

J'ai un projet qui utilise AsyncTask pour faire le travail en arrière-plan.
Ce projet utilise également une classe en tant que support générique pour les valeurs statiques comme les clés de la base de données, mais aussi pour un ou deux objets utiles pour l'ensemble du projet. Disons que cette classe est appelée public class Constants.

Je veux accéder à un de ces objets à partir d'un AsyncTask, et je ne sais pas si je dois le copier ou non.
Je ne suis pas en fait à obtenir des erreurs ou des accidents, mais je reçois quelques plantages de rapports les commentaires des utilisateurs que je ne peux pas reproduire, donc je suis gessing que je fais quelque chose de mal avec cela.

Mon traitement actuel est la suivante:

onStart() {// somewhere in the UI thread  
new MyTask(Constants.theObject).execute(); // (1)  
}  
// ...  
class MyTask extends AsyncTask<...> {  
MyObjectType object;  
MyTask(MyObjectType theObjectInstance) {  
object = theObjectInstance; // (2)  
// ...  
doInBackground() { // (3)  
//  ...  
} 

Dans (1), Constants.theObject est un objet statique créé au démarrage de l'application

Dans (2), je reçois une référence à l'objet statique existant Constants.theObject

Dans (3), nous ne sommes plus dans le fil de l'interface utilisateur, et je veux Constants.theObject d'accès (qui peut également être utilisé dans le thread principal)

.

Je pense qu'il ya trois cas possibles.

  • ce code est laid, je devrais faire autrement
  • ce code est OK, les commentaires des utilisateurs ne sont pas sur ce
  • ce code est tout à fait correct, mais je devrais en faire une copie Constants.theObject si je veux l'utiliser dans doInBackground; sinon il peut échouer

J'espère que vous pouvez me aider! Merci beaucoup pour la lecture.

Était-ce utile?

La solution

D'après ce que vous avez écrit, je ne pense pas que vous devez faire une copie, à moins que MyObjectType est thread-safe, dans ce cas, vous devez vous assurer que seulement 1 fil à la fois est le modifier / elle est -non-thread-safe-méthodes. (Faire une copie serait en effet résoudre, mais si vous pouvez faire une copie, est un global statique vraiment ce que vous devriez utiliser quand même?)

Êtes-vous sûr à 100% que 1 et 3 ne peut se produire après que l'objet a été initialisé?

Autres conseils

Il peut être parce que plus d'un thread tente de changer le même objet. il peut provoquer des résultats inattendus / échec complet. Vous pouvez utiliser un verrou wanna de sorte qu'aucun 2 fils peut à jour l'objet en même temps. Ce cas, il va ralentir vos opérations de ASYNCH car ils dépendent tous d'une intance exacte. Je suppose que vous utilisez l'objet statique pour une raison, vous voudrez peut-être envisager de faire une autre manière si possible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top