2014-04-30 5 views
0

J'ai une classe interne statique qui étend le fil à l'intérieur de mon activité principale. Dans ce fil, je dois appeler une méthode non statique de mon activité principale.Méthode non statique d'appel int statique classe

Comme je le vois, j'ai 2 options:

  • Faire ma méthode non statique statique: Cette option ne serait pas possible dans la cause de cette méthode que j'appelle startActivityForResult et je ne peux pas appeler cela dans une statique façon.
  • Créez un objet de mon activité principale dans la classe statique interne et appelez la méthode via cet objet.

    MainActivity mActivity = new MainActivity(); 
    //... 
    mActivity.method(); 
    

Celui que je me sers est maintenant le deuxième, mais j'ai un doute à ce sujet. Si je fais cela, je comprends que je crée une nouvelle instance de MainActivity, et ce faisant, toutes les définitions de la méthode onCreate sont-elles appelées? Ou j'appelle juste la méthode et les variables que j'utilise à l'intérieur seront nulles?

MISE À JOUR -

C'est la classe intérieure où je dois appeler la méthode de la principale. J'ai besoin de cela pour être statique parce que la fonctionnalité de base de l'application a besoin de cette façon. Maintenant, je présente une nouvelle méthode de l'activité principale qui doit être appelée lorsqu'une action se passe à l'intérieur du fil:

private static final class DetectionThread extends Thread { 
    //... 

    public DetectionThread(byte[] data, int width, int height) { 

    } 

    @Override 
     public void run() { 

     //DO STUFF HERE 

     //Action happens and calls the method from main activity: 
     SpeechWhenMotion(); 
     //... 
     } 
    } 
} 

Et c'est l'en-tête de la méthode qui est définie dans l'activité principale. A l'intérieur de celui-ci j'appelle à une autre méthode qui commence l'activité pour résultat, c'est donc la raison pour laquelle je ne peux pas définir cette méthode statique:

public void SpeechWhenMotion() { 
    //... 
} 
+4

Le code postal expliquera plus. –

+2

Vous ne décidez pas d'utiliser le mot-clé statique simplement parce que vous avez codé votre méthode pour qu'elle soit statique et que vous ne le faites pas non plus. Voyez si vous pouvez changer votre conception et réfléchir un peu à savoir si votre logique varie d'une instance à l'autre ou est statique tout au long. – prabugp

+0

'inner static class' si la classe interne est censée utiliser des méthodes non statiques de sa classe externe, il semble qu'elle ne devrait pas être statique en premier lieu. Pouvez-vous ajouter quelques explications sur vos décisions de conception? – Pshemo

Répondre

0

passer une instance de MainActivity à votre méthode statique. Puis appelez .method() à partir de cette instance.

static void doSomething(MainActivity ma) { 
    ma.method(); 
} 

Ceci, ou la 2ème option que vous avez publiée.

+0

2ème option est erronée. Ne jamais instancier des activités avec 'new'. – laalto

1

En supposant MainActivity est la classe externe, je suppose que ce que vous recherchez est l'

MainActivity.this.startActivityForResult() 

Création d'un autre objet n'est pas la bonne solution.

Et BTW, il est tout aussi mauvais de créer un fil d'extension de classe. Je ne vois pas pourquoi vous devriez le faire. Pour tout ce que vous devez faire à moins d'un thread sophistiqué, tout ce que vous devez faire est d'implémenter Runnable(). Cela permet de bien séparer votre problème de threading de votre logique métier.

+0

Ajout d'un code qui pourrait expliquer un peu plus – masmic

Questions connexes