【问题标题】:"No enclosing instance of type" error while calling method from another class in Android从 Android 中的另一个类调用方法时出现“没有封闭类型的实例”错误
【发布时间】:2012-02-21 15:45:14
【问题描述】:

同学们,我有这样一个问题: 1. 在我的第一堂课中,我有

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

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

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

我收到来自 Eclipse 的下一条错误消息

没有可以访问 MainActivity 类型的封闭实例。必须使用 MainActivity 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 MainActivity 的实例)。

这个问题对我来说确实笼罩在迷雾中。那么,如何从另一个类中调用这个方法呢?

【问题讨论】:

    标签: android methods android-asynctask instance


    【解决方案1】:

    就这里的实际错误而言,如果parseYouTubeAndYahoo 类是您的 Activity 内部的非静态内部类,那么您需要一个封闭类的实例来实例化内部类。所以,你需要:

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

    但是....

    您真的不应该从 Activity 外部实例化您的活动的非静态内部类,因为为了实例化非静态内部类,您必须实际实例化封闭类,在这个案例,就是Activity。活动旨在启动,而不是通过new 实例化。如果您想在不同的地方使用AsyncTask,则创建一个从AsyncTask 扩展的新顶级类。

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

    请注意,如果您需要获取 static 嵌套类,您尝试使用的语法将起作用。这是因为在这种情况下,外部类实际上只是充当命名空间,但嵌套类,因为它是静态的,实际上并不需要对外部类的实例的引用。因此:

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

    是获取 static 嵌套类实例的正确语法。

    【讨论】:

      【解决方案2】:

      我猜你的parseYouTubeAndYahoo类是MainActivity类中的一个内部类,在Java中,你应该用new MainActivity().new parseYouTubeAndYahoo()实例化内部类的一个对象,所以像这样调用那个方法new MainActivity().new parseYouTubeAndYahoo().execute("someURL");

      我也猜想MainActivity 扩展了Activity 类,所以我认为当您在MainActivity 类中调用此方法时,答案应该是this.new parseYouTubeAndYahoo().execute("someURL");

      【讨论】:

        【解决方案3】:

        将 AsuncTask 作为单独的类放入另一个文件会更容易。

        但如果你真的想拥有一个内部类,那么要么它必须是静态的,要么你需要先获取对它的父类的引用,这可以这样完成:

        在 MainActivity 的 onCreate 中:

        静态 MainActivity activityInstance = getContext();

        MainActivity 中的新方法:

        public static MainActivity getActivityInstance(){
          return activityInstance;
        }
        

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

        MainActivity instanceOfMainActivity = MainActivity.getInstance();

        然后

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-16
            • 1970-01-01
            • 1970-01-01
            • 2012-06-04
            • 1970-01-01
            • 2015-06-10
            • 1970-01-01
            • 2011-12-30
            相关资源
            最近更新 更多