web-dev-qa-db-fra.com

Erreur "Pas d'instance de type englobante" lors de l'appel de la méthode à partir d'une autre classe dans Android

Chers collègues, j'ai la question suivante: 1. Dans ma première classe, j'ai

public class parseYouTubeAndYahoo extends AsyncTask<String, Void, List<VideoDataDescription>>

pour analyser les données d'Internet. Mais j'ai besoin d'appeler la méthode execute () de cette classe à partir d'une autre classe. En essayant de redresser un tel code:

new MainActivity.parseYouTubeAndYahoo().execute("someURL"); 

J'ai le prochain message d'erreur d'Eclipse

Aucune instance englobante de type MainActivity n'est accessible. Doit qualifier l'allocation avec une instance englobante de type MainActivity (par exemple x.new A() où x est une instance de MainActivity).

et vraiment ce problème est enveloppé de brouillard pour moi. Alors, comment appeler cette méthode à partir d'une autre classe?

23
Eugene Shmorgun

En termes d'erreur réelle ici, si la classe parseYouTubeAndYahoo est une classe interne non statique à l'intérieur de votre activité, alors vous avez besoin d'une instance de la classe englobante afin d'instancier la classe interne. Vous aurez donc besoin de:

MainActivity myActivity = new MainActivity();
MainActivity.parseYouTubeAndYahoo asyncTask = myActivity.new parseYouTubeAndYahoo();

Toutefois....

Vous ne devriez vraiment pas instancier des classes internes non statiques de vos activités en dehors de Activity car pour instancier une classe interne non statique, vous devez réellement instancier la classe englobante, qui, dans ce cas, est l'activité. Les activités doivent être démarrées et non instanciées via new. Si vous avez un AsyncTask que vous souhaitez utiliser à différents endroits, créez une nouvelle classe de niveau supérieur qui s'étend de AsyncTask.

(Pour un exemple de création de AsyncTasks réutilisables, voir: https://github.com/levinotik/ReusableAsyncTask )

Notez que la syntaxe que vous avez essayé d'utiliser fonctionnerait si vous aviez besoin de récupérer une classe imbriquée statique . En effet, dans un tel cas, la classe externe agit vraiment comme un espace de noms, mais la classe imbriquée, car elle est statique, n'a pas réellement besoin d'une référence à une instance de la classe externe. Donc:

OuterClass.StaticNestedClass nestedObject =
     new OuterClass.StaticNestedClass();

est la syntaxe appropriée pour obtenir une instance d'une classe statique imbriquée.

54
LuxuryMode

Je suppose que votre classe parseYouTubeAndYahoo est une classe interne dans la classe MainActivity, en Java, vous devez instancier un objet de la classe interne par new MainActivity().new parseYouTubeAndYahoo(), alors appelez cette méthode comme ceci new MainActivity().new parseYouTubeAndYahoo().execute("someURL");

Je suppose également que MainActivity étend la classe Activity, donc je pense que la réponse devrait être this.new parseYouTubeAndYahoo().execute("someURL"); lorsque vous appelez cette méthode à l'intérieur de votre classe MainActivity.

3
Huang

Il serait plus simple de placer AsuncTask dans un autre fichier en tant que classe séparée.

Mais si vous voulez vraiment avoir une classe interne, alors elle doit être statique ou vous devez d'abord obtenir une référence à sa classe parent, ce qui pourrait être fait comme ceci:

dans onCreate of MainActivity:

static MainActivity activityInstance = getContext ();

Nouvelle méthode dans MainActivity:

public static MainActivity getActivityInstance(){
  return activityInstance;
}

Ensuite, dans une autre activité, vous pouvez obtenir l'instance et accéder à ses méthodes publiques

MainActivity instanceOfMainActivity = MainActivity.getInstance ();

Ensuite

new instanceOfMainActivity.parseYouTubeAndYahoo (). execute ("someURL");

3
Lumis

Référencez le contexte de l'activité à une autre classe et utilisez-le.

Comme ça: oneofconstructer public (Context ctx, .....)

1
Tugrul