【发布时间】:2020-09-06 08:08:39
【问题描述】:
首先,即使这个问题之前可能已经回答过,我仍然不知道如何解决这个问题,因为我从未使用过WeakReferences,尽管阅读了一些答案/示例,但我仍然不知道不知道怎么做。
我正在开发的应用程序将有一个显示分钟、秒和毫秒的 Chronometer,这是原始 Android Chronometer 无法做到的。所以我四处寻找一些替代品,发现了一个GitHub library,它本质上是一个改良的天文台。 导入库后,我注意到一个 Lint 警告说
这个 Handler 类应该是静态的,否则可能会发生泄漏(匿名 android.os.Handler)
在第 147 行:
private Handler mHandler = new Handler() {
public void handleMessage(Message m) {
if (mRunning) {
updateText(SystemClock.elapsedRealtime());
dispatchChronometerTick();
sendMessageDelayed(Message.obtain(this , TICK_WHAT),
100);
}
}
};
看起来推荐的修复方法是创建 Handler 类 static 并使用 WeakReferences 访问 UI。所以,在用private static class mHandler extends Handler 替换private Handler mHandler = new Handler() 后,警告消失了……但现在出现了一些错误。
无法从静态上下文中引用布尔值 mRunning 以及方法 updateText(long) 和 dispatchChronometerTick()。
在将它们设为static 后,现在会出现更多相同但变量不同的错误。在也将它们设为static 之后,我有义务撤消我刚刚所做的,因为无法从静态上下文中引用setText(text); 和com.example.myapp.Chronometer.this,这将再次显示先前的错误;并制作sendMessageDelayed(android.os.Message, long) 和removeMessages(int) static,我相信这不能从代码中完成。 (点击链接看看我在说什么台词)。
因此,通过修复某些内容,其他地方会出现错误,我将不得不撤消我所做的。
如果有人能帮我解决这个问题,我将不胜感激。
【问题讨论】:
标签: android