【问题标题】:How to reference non-static method 'findViewById' from a static context?如何从静态上下文中引用非静态方法“findViewById”?
【发布时间】:2015-09-28 07:41:33
【问题描述】:

我刚刚开始进行android开发,我被困在这个:

static Handler h = new Handler()
{
    @Override
    public void handleMessage(Message msg) {
        TextView buttonmain = (TextView)findViewById(R.id.buttonmainid);
        if(buttonmain.getText()=="Text1")
            buttonmain.setText("Text2");
        else
            buttonmain.setText("Text1");
    }
};

这会导致在静态上下文中访问 findViewById() 方法时出错。

【问题讨论】:

  • 为什么Handler 必须是静态的?
  • 为什么需要Handler?
  • 防止内存泄漏。这是我在使用时发现的警告。@mr.icetea
  • 文本视图定义在创建视图和静态视图中,在静态方法下调用
  • static 东西在类加载时被加载,viewscontext 上可用。当类为initialized 时,Context 被初始化。这意味着,您必须等待获取视图,直到活动上下文可用。 Context 将在 onCreate() 中可用,因此通常会在此处加载视图。我建议您快速查看 Android 指南(此类信息的最佳位置)

标签: java android static static-methods android-context


【解决方案1】:

我认为在这种情况下你不应该让你的处理程序静态。事实上,非静态处理程序确实会导致内存泄漏,但并非总是如此。如果您刚刚开始 Android 开发,您可能不会遇到导致内存泄漏的情况。

当您向处理程序发送在类被销毁之前未处理的消息时,通常会出现此问题。换句话说,要发生内存泄漏,必须发生以下情况:

  1. 创建实例
  2. 创建处理程序
  3. 向处理程序发送消息
  4. 销毁类
  5. Handler 处理消息。

在这种情况下会有内存泄漏。但我非常怀疑这会发生。

但是,要回答您的问题,一个简单的方法是将以下内容添加到您的课程中:

static MyClass instance;

在构造函数中:

MyClass.instance = this;

但请注意这一点,当您获得同一个类的多个实例时,这将永远无法正常工作,因此您可能需要研究单例。

【讨论】:

    【解决方案2】:

    您需要一个带有 contentView 的 Activity 实例,您希望从中获取一个 View。

    但是...查看您的代码,我认为您应该直接传递 TextView 实例。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多