Ошибка "Отсутствие экземпляра типа" при вызове метода из другого класса в 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).
и действительно эта проблема окутана туманом для меня. Итак, как вызвать этот метод из другого класса?
Ответы
Ответ 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,.....)