Ошибка «Нет включающего экземпляра типа» при вызове метода из другого класса в Android - PullRequest
23 голосов
/ 29 января 2012

Коллеги, у меня такой вопрос: 1. В моем первом классе у меня есть

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

для разбора данных из интернета. Но мне нужно вызвать метод execute () этого класса из другого класса. При попытке исправить такой код:

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

У меня есть следующее сообщение об ошибке от Eclipse

Нет включающего экземпляра типа MainActivity. Должен квалифицировать распределение с включающим экземпляром типа MainActivity (например, x.new A (), где x - это экземпляр MainActivity).

и действительно эта проблема скрыта для меня в тумане. Итак, как вызвать этот метод из другого класса?

Ответы [ 4 ]

54 голосов
/ 29 января 2012

С точки зрения фактической ошибки здесь, если parseYouTubeAndYahoo класс является нестатическим внутренним классом внутри вашей Деятельности, то вам нужен экземпляр включающего класса для создания экземпляра внутреннего класса. Итак, вам понадобится:

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

Однако ....

Вы действительно не должны создавать экземпляры нестатических внутренних классов ваших Деятельностей вне Activity, потому что для того, чтобы создать экземпляр нестатического внутреннего класса, вы должны на самом деле создать экземпляр включающего класса, который в этом случай, это деятельность. Действия должны быть начаты, а не созданы с помощью new. Если у вас есть AsyncTask, который вы хотите использовать в разных местах, то создайте новый класс верхнего уровня, который расширяется от AsyncTask.

(Пример создания повторно используемого AsyncTasks см. https://github.com/levinotik/ReusableAsyncTask)

Обратите внимание, что синтаксис, который вы пытались использовать, БУДЕТ работать, если вам нужно захватить вложенный класс static . Это связано с тем, что в таком случае внешний класс на самом деле просто действует как пространство имен, но вложенный класс, поскольку он статический, на самом деле не нуждается в ссылке на экземпляр внешнего класса. Таким образом:

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

- правильный синтаксис для получения экземпляра статического вложенного класса.

3 голосов
/ 29 января 2012

Было бы проще просто поместить AsuncTask в другой файл как отдельный класс.

Но если вы действительно хотите иметь внутренний класс, то либо он должен быть статическим, либо вам нужно получитьсначала ссылка на родительский класс, что можно сделать следующим образом:

в onCreate of MainActivity:

static MainActivity activityInstance = getContext ();

Новый метод в MainActivity:

public static MainActivity getActivityInstance(){
  return activityInstance;
}

Затем в другом упражнении вы можете получить экземпляр и получить доступ к его открытым методам

MainActivity instanceOfMainActivity = MainActivity.getInstance ();

Затем

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

3 голосов
/ 29 января 2012

Полагаю, ваш parseYouTubeAndYahoo класс является внутренним классом в классе MainActivity, в Java вы должны создать экземпляр объекта внутреннего класса с помощью new MainActivity().new parseYouTubeAndYahoo(), поэтому вызовите этот метод следующим образом new MainActivity().new parseYouTubeAndYahoo().execute("someURL");

Я также предполагаю, что MainActivity расширяет класс Activity, поэтому я думаю, что ответ должен быть this.new parseYouTubeAndYahoo().execute("someURL");, когда вы просто вызываете этот метод внутри вашего MainActivity класса.

1 голос
/ 29 января 2012

Ссылка на контекст действия для другого класса и использование его.

Например: public oneofconstructer (Context ctx, .....)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...