Подтвердить что ты не робот

Ошибка "Отсутствие экземпляра типа" при вызове метода из другого класса в Android

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

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

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

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

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

Доступен закрытый экземпляр типа MainActivity. Необходимо присвоить выделение с помощью экземпляра типа MainActivity (например, x.new A(), где x - экземпляр MainActivity).

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

4b9b3361

Ответ 1

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

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

Однако....

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

in onCreate of MainActivity:

static MainActivity activityInstance = getContext();

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

public static MainActivity getActivityInstance(){
  return activityInstance;
}

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

MainActivity instanceOfMainActivity = MainActivity.getInstance();

Тогда

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

Ответ 4

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

Аналогично: public oneofconstructer (Context ctx,.....)