“No enclosing instance of type” error while calling method from another class in Android

后端 未结 4 1902
庸人自扰
庸人自扰 2020-11-29 06:33

Colleagues, I have the such question: 1. In my first class I have the

public class parseYouTubeAndYahoo extends AsyncTask

        
相关标签:
4条回答
  • 2020-11-29 07:03

    In terms of the actual error here, if parseYouTubeAndYahoo class is a non-static inner class inside of your Activity, then you need an instance of the enclosing class in order to instantiate the inner class. So, you'll need:

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

    However....

    You really shouldn't be instantiating non-static inner classes of your Activities from outside of the Activity because in order to instantiate a non-static innner class, you have to actually instantiate the enclosing class, which, in this case, is the Activity. Activities are meant to be started, not instantiated via new. If you have an AsyncTask that you'd like to use in different places, then create a new top-level class that extends from AsyncTask.

    (For an example of creating reusable AsyncTasks, see: https://github.com/levinotik/ReusableAsyncTask)

    Note that the syntax you've tried to use WOULD work if you needed to grab a static nested class. This is because in such a case, the outer class is really just acting as a namespace, but the nested class, because its static, does not actually need a reference to an instance of the outer class. Thus:

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

    is the proper syntax for getting an instance of a static nested class.

    0 讨论(0)
  • 2020-11-29 07:08

    It would be easier just to place AsuncTask into another file as a separete class.

    But if you really want to have is an inner class, then either it has to be static or you need to obtain a reference to its parent class first, which could be done like this:

    in onCreate of MainActivity:

    static MainActivity activityInstance = getContext();

    New method in MainActivity:

    public static MainActivity getActivityInstance(){
      return activityInstance;
    }
    

    Then in another activity you can get the instance and access its public methods

    MainActivity instanceOfMainActivity = MainActivity.getInstance();

    Then

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

    0 讨论(0)
  • 2020-11-29 07:12

    Reference the context of activity to other class and use it.

    Like that: public oneofconstructer(Context ctx, .....)

    0 讨论(0)
  • 2020-11-29 07:23

    I guess your parseYouTubeAndYahoo class is an inner class in class MainActivity, in Java, you should instaniate an object of the inner class by new MainActivity().new parseYouTubeAndYahoo(), so call that method like this new MainActivity().new parseYouTubeAndYahoo().execute("someURL");

    I also guess MainActivity extends the Activity class, so I think the answer should be this.new parseYouTubeAndYahoo().execute("someURL"); when you just call this method inside your MainActivity class.

    0 讨论(0)
提交回复
热议问题