Android:从静态处理程序类调用非静态方法

2024-05-07

鉴于此代码:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

public static final int MESSAGE_NOT_CONNECTED = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
}

// -------------------------------------------------
public final void setStatus(int Rid) {
    final ActionBar actionBar = getActionBar();
    actionBar.setSubtitle(Rid);
}

// -------------------------------------------------
static Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case MESSAGE_NOT_CONNECTED:
            setStatus(R.string.title_not_connected);
            break;
        }
    }
}
}

我收到编译错误:无法对非静态方法 setStatus(int) 进行静态引用...

这是有道理的,因为 setStatus() 中的 getActionBar() 是一个非静态方法。

由于警告,我将 Handler 类设置为静态:此 Handler 类应该是静态的,否则可能会发生泄漏。

问题:如何从静态处理程序中正确访问 setStatus() 方法?

编辑:新的处理程序代码就是答案。

static class hHandler extends Handler {
    private final WeakReference<MainActivity> mTarget;
    hHandler(MainActivity target) {
        mTarget = new WeakReference<MainActivity>(target);
    }

    @Override
    public void handleMessage(Message msg) {
        MainActivity target = mTarget.get();
        If(target == null) {
             return;
        }
        switch (msg.what) {
        case MESSAGE_NOT_CONNECTED:
            target.setStatus(R.string.title_not_connected);
            break;
        }
    }
}

尝试使用WeakReference,如本文所述article http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:从静态处理程序类调用非静态方法 的相关文章

随机推荐

  • 按升序选择最后 20 个顺序 - PHP/MySQL

    这是我的表结构 MyTable ID P K auto increment TopicID UID Comment 现在我想获取某个 TopicID 的最后 20 条评论 但它应该按升序排序 就像 Facebook 默认只显示最后 20 条
  • Angular刷新页面重复url中的页面

    我是一名 Angular 新手 正在构建一个简单的寻呼机 我设置了路由器 以便空 URL 重定向到仪表板组件 因此localhost 4200会自动路由到localhost 4200 dashboard完美的 但是 如果我单击刷新按钮 它会
  • mysql 更新或插入多条记录(如果表中尚不存在)

    mysql 数据库中有一个名为 inventory item 的表 id product id 和 quantity 是表的列 id 是主键 在插入记录时自动生成 当用户提交要向表中插入多条记录的表单时 可以在 foreach 循环中收集所
  • C4533 警告:为什么 goto 会跳过变量初始化?

    我越来越 警告 C4533 goto FreeDC 跳过了 b 的初始化 但是如果代码到达标签FreeDC in WM CREATE b 未初始化 如果在这种情况下未初始化 如何跳过其初始化 我只是不明白这个警告 include
  • iOS 6 模拟器卡在启动画面上

    我正在使用 Mac os 10 8 2 和 Xcode 4 5 2 当我尝试在 ios 5 5 1 模拟器中运行我的应用程序时 它工作正常 但是当我尝试在 ios 6 模拟器中运行应用程序时 它会卡在空白屏幕上 谁能让我知道我的问题的解决方
  • Gradle 构建错误:aidl.exe 以非零退出值 1 完成

    这是我的 build gradle 文件 点击查看截图 https i stack imgur com ENTbh png 和我的错误 错误 任务 app compileDebugAidl 执行失败 com android ide comm
  • 为 schtasks.exe 指定日期参数的独立于语言的方法

    我正在尝试将新任务添加到 Windows 任务计划程序schtasks exe 我现在遇到的问题是指定任务应该在一周中的哪一天运行 据我所知 愚蠢的程序坚持将该参数作为日期名称的字符串缩写 本地化为操作系统语言 其他参数可以很好地接受英语字
  • 普通的 x86 或 AMD PC 是直接从 ROM 运行启动/BIOS 代码,还是先将其复制到 RAM? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道现代计算机已经修改了哈佛架构 它们可以从保存数据的地方以外的地方读取指令 这一事实是否允许它们直接从 ROM 芯片获取指令 他们是先
  • 使用 Proguard 混淆 ActionBarSherlock

    我正在尝试使用混淆我的 Android 应用程序proguard and ant eclipse proguard从来不工作 总是失败error 1 但我越来越class file unexpectedly contains class 到
  • 高性能 C# 服务器套接字的提示/技术

    我有一个 NET 2 0 服务器似乎遇到了扩展问题 可能是由于套接字处理代码的设计不佳 我正在寻找有关如何重新设计它以提高性能的指导 使用场景 50 150 个客户端 每个客户端以高速率 高达 100 秒 秒 发送小消息 每条 10 字节
  • PostgreSQL函数中如何返回查询结果行?

    我按照教程尝试了很多次 但都失败了 有人可以给我一些例子吗 这是我的代码 它提示 ERROR invalid type name SETOF RECORD create or replace function find returns SE
  • Java-&& 评估

    任何人都可以帮助我解决以下问题 我有这样的代码 if cond1 cond2 cond10 这里 cond1 是昂贵的操作 其输出是布尔值 现在我的问题是 当 cond2 输出为 false 时 JAVAC 会做什么 具体来说 它是评估 c
  • 在 RESTful WCF 中混合 XML 和 JSON,无需单独的方法

    我有一个 RESTful WCF 服务 可以返回 XML JSON 或 JSONP 具体取决于参数 例如 service svc stuff format xml or service svc stuff format json callb
  • jQuery 如何修复无法设置未定义的属性“_DT_CellIndex”?

    我是 Jquery 的新手 我希望一旦用户添加新行并在单击 Ajouter 按钮后提供重要信息 它将添加到数据库中 然后自动重新加载表 一旦我运行 我发现数据已成功添加到数据库 但是 tablebqup 不再重新加载 并且我发现了此错误 U
  • SyntaxError: JSON.parse: JSON 数据第 1 行第 1 列出现意外字符

    我花了 6 个多小时在代码中查找异常或特殊字符 但我找不到 我检查了这里所有类似的消息 我正在发送带有放大弹出窗口的表格 首先 我使用内联弹出窗口打开表单 然后将所有输入发送到 main js 进行验证 所以 我只需要第三只眼 我有 ind
  • 如何在 React-Native 中停止触摸事件传播

    我有一个带有图像网格的滚动视图 当我长按图像时 我想停止将鼠标事件传播到滚动视图并仅监视移动 目的是在按下时重新初始化传播 有人知道怎么做吗 将以下内容添加到
  • 如何在 iOS 中使用 AVPlayer 缓冲音频?

    我想播放来自互联网的流音频 我编写了播放流的代码 但它没有任何缓冲区 因此如果信号较弱 应用程序将停止播放音频 这是我的代码 import UIKit import AVFoundation import MediaPlayer impor
  • Postman - 所需的 MultipartFile 参数不存在 - Spring,Java [重复]

    这个问题在这里已经有答案了 Edit 这个问题不同于 jQuery Ajax 文件上传 所需的 MultipartFile 参数 文件 不存在 https stackoverflow com q 29488852 2279082不同之处在于
  • 在提交调试之前显示表单值

    如何在表单提交之前将所有表单值转储到警报框中 我有一个像这样的简单表单 我想在提交时在警报或控制台中查看表单值 我正在使用 jQuery 和 jQueryUI DIALOG 作为表单 但任何方法都可以 div title Some More
  • Android:从静态处理程序类调用非静态方法

    鉴于此代码 public class MainActivity extends FragmentActivity implements ActionBar TabListener public static final int MESSAG