同事们,我有这样的问题: 在我的第一堂课中,我有
public class parseYouTubeAndYahoo extends AsyncTask<String, Void, List<VideoDataDescription>>
解析来自互联网的数据。但我需要从另一个类调用此类的execute()方法。在尝试修正此类代码时:
new MainActivity.parseYouTubeAndYahoo().execute("someURL");
我有Eclipse的下一条错误消息
无法访问类型为MainActivity的封闭实例。必须使用MainActivity类型的封闭实例限定分配(例如x.new A(),其中x是MainActivity的实例)。 的
这个问题真的笼罩在雾中。那么,如何从另一个类调用此方法?
答案 0 :(得分:54)
就这里的实际错误而言,如果parseYouTubeAndYahoo
类是Activity内部的非静态内部类,那么您需要一个封闭类的实例来实例化内部类。所以,你需要:
MainActivity myActivity = new MainActivity();
MainActivity.parseYouTubeAndYahoo asyncTask = myActivity.new parseYouTubeAndYahoo();
然而....
你真的不应该在Activity
之外实例化你的Activity的非静态内部类,因为为了实例化一个非静态的内部类,你必须实际实例化封闭类,在这种情况下,是活动。活动意在启动,而不是通过new
实例化。如果您要在不同的地方使用AsyncTask
,请创建一个从AsyncTask
延伸的新顶级类。
(有关创建可重复使用AsyncTasks
的示例,请参阅:https://github.com/levinotik/ReusableAsyncTask)
请注意,如果您需要获取静态嵌套类,那么您尝试使用的语法将起作用。这是因为在这种情况下,外部类实际上只是作为命名空间,但嵌套类,因为它的静态,实际上不需要引用外部类的实例。因此:
OuterClass.StaticNestedClass nestedObject =
new OuterClass.StaticNestedClass();
是获取静态嵌套类的实例的正确语法。
答案 1 :(得分:3)
我猜你的parseYouTubeAndYahoo
类是类MainActivity
中的内部类,在Java中,你应该通过new MainActivity().new parseYouTubeAndYahoo()
实现内部类的对象,所以像这样调用那个方法{ {1}}
我还猜new MainActivity().new parseYouTubeAndYahoo().execute("someURL");
扩展了MainActivity
类,所以当您在Activity
类中调用此方法时,我认为答案应为this.new parseYouTubeAndYahoo().execute("someURL");
。
答案 2 :(得分:3)
将AsuncTask作为separete类放入另一个文件会更容易。
但是如果你真的想拥有一个内部类,那么它必须是静态的,或者你需要首先获得对它的父类的引用,这可以这样做:
在MainActivity的onCreate中:
static MainActivity activityInstance = getContext();
MainActivity中的新方法:
public static MainActivity getActivityInstance(){
return activityInstance;
}
然后在另一个活动中,您可以获取实例并访问其公共方法
MainActivity instanceOfMainActivity = MainActivity.getInstance();
然后
new instanceOfMainActivity.parseYouTubeAndYahoo()。execute(“someURL”);
答案 3 :(得分:1)
将活动的上下文引用到其他类并使用它。
就像那样:public oneofconstructer(Context ctx,.....)