'这'在匿名课堂内

时间:2016-10-14 17:02:36

标签: android class this anonymous

我注意到奇怪的事情。在匿名类中,这个引用指向外部类。例如:

public MyView view;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    toggleFullscreen(true);
    this.view=new MyView(this);
    setContentView(R.layout.activity_main);
    //load data
    LoadGameDataTask task=new LoadGameDataTask(..loading params);

    task.setListener(new LoadGameDataTask.OnDataLoadedListener() {
        @Override
        public void OnDataLoaded(GameData data) {
    //this -reference to activity
            Log.d("load","completed,this:"+this.toString());// D/load: completed,this:net.rhyboo.com.gl_test.MainActivity$1@34dfbb38
            //this.setContentView(this.view);
        }
    });
    task.execute();
}

如果我运行此代码 - 数据加载完成后,我可以看到this指向我的活动。但是,如果我取消注释this.setContentView(this.view); - 我收到编译错误 - cannot resolve method setContentView。因为编译器认为this是对LoadGameDataTask.OnDataLoadedListener的引用。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

匿名类具有自动分配的名称 - $前面加上外部类名称的序列号。 net.rhyboo.com.gl_test.MainActivity$1。请注意,这不是MainActivity类,而是匿名类名。 $1表示第一个内部类。

要从匿名内部类访问外部类,您应该添加外部类的名称。如果您的活动是MainActivity,请使用:

MainActivity.this.setContentView(this.view);