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

23
同事们,我有一个问题: 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

就实际错误而言,如果parseYouTubeAndYahoo类是你的Activity内部的非静态内部类,则需要一个封闭类的实例来实例化该内部类。因此,你需要:

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

然而,你不应该在Activity外部实例化非静态内部类,因为要实例化非静态内部类,必须先实例化封闭类,即Activity。Activity应该通过new来启动,而不是被实例化。如果你想在不同的地方使用AsyncTask,那么就创建一个新的从AsyncTask继承的顶级类。

(有关创建可重用AsyncTasks的示例,请参见:https://github.com/levinotik/ReusableAsyncTask

请注意,你尝试使用的语法可以用于访问静态嵌套类。这是因为在这种情况下,外部类只是作为命名空间,但由于嵌套类是静态的,不需要实际引用外部类的实例。

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

获取静态嵌套类实例的正确语法是OuterClass.InnerClass instance = new OuterClass.InnerClass();


3

把 AsuncTask 放到另一个文件作为单独的类会更容易一些。

但如果你真的想要一个内部类,那么它必须是静态的,或者你需要先获取其父类的引用,可以像这样实现:

在 MainActivity 的 onCreate 中:

static MainActivity activityInstance = getContext();

在 MainActivity 中新建方法:

public static MainActivity getActivityInstance(){
  return activityInstance;
}

然后在另一个活动中,您可以获取该实例并访问其公共方法

MainActivity instanceOfMainActivity = MainActivity.getInstance();

然后

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


3
我猜测你的parseYouTubeAndYahoo类是作为内部类在MainActivity类中的,Java中,你应该通过new MainActivity().new parseYouTubeAndYahoo()来实例化一个内部类的对象,所以调用该方法的方式应该像这样:new MainActivity().new parseYouTubeAndYahoo().execute("someURL"); 我还猜测MainActivity扩展了Activity类,因此当你在MainActivity类中调用该方法时,答案应该是this.new parseYouTubeAndYahoo().execute("someURL");

1

将活动的上下文引用到其他类并使用它。

像这样:public oneofconstructer(Context ctx, .....)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接