从Android中的另一个类调用方法时,“没有封闭的类型实例”错误

时间:2012-01-29 14:20:06

标签: android methods android-asynctask instance

同事们,我有这样的问题: 在我的第一堂课中,我有

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

解析来自互联网的数据。但我需要从另一个类调用此类的execute()方法。在尝试修正此类代码时:

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

我有Eclipse的下一条错误消息

无法访问类型为MainActivity的封闭实例。必须使用MainActivity类型的封闭实例限定分配(例如x.new A(),其中x是MainActivity的实例)。

这个问题真的笼罩在雾中。那么,如何从另一个类调用此方法?

4 个答案:

答案 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,.....)