android - 匿名类中的“this”

标签 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 指向我的 Activity 。但是,如果我取消注释 this.setContentView(this.view); -我收到编译错误 - 无法解析方法 setContentView。这是因为编译器认为 this 是对 LoadGameDataTask.OnDataLoadedListener 的引用。

为什么会发生这种情况?

最佳答案

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

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

MainActivity.this.setContentView(this.view);

关于android - 匿名类中的“this”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40048446/

相关文章:

java - 在android studio中创建新项目时出现junit错误

android - 类型为 "audio/*"的 Intent.ACTION_GET_CONTENT 不起作用 - 显示所有文件

android - 在 Android 中取消 Asynctask 的正确方法

javascript - 我可以使用 "this"访问范围对象本身的属性吗?

android - 查询电池容量

没有模板参数的 C++ 模板?

java - 为什么我的程序不能访问 Java 中的数学方法?

C++ 类排序

javascript - 类中的箭头函数

c# - 将 system.reflection 替换为 "this"