【发布时间】:2020-08-17 15:12:52
【问题描述】:
当使用后台线程工作时,通常您会通过 Handler 更新 UI。
一种方法是在类级别定义一个处理程序,如this answer 和this answer 中所述
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//update UI or call class methods here
}
};
但是,此构造会导致以下警告
Handler class should be static otherwise memory leaks might occur
另一种方法是使用this answer 和this answer 中概述的静态内部类
static class MyHandler extends Handler {
private final WeakReference<Type> myWeakReference;
MyHandler(Type reference) {
myWeakReference = new WeakReference<Type>(reference);
}
@Override
public void handleMessage(Message msg)
{
//Update UI or call class methods here using weak reference
}
}
但是,根据 Android 文档,这种形式的构造函数已被弃用。
公共处理程序()
此构造函数已弃用。期间隐式选择 Looper 处理程序构造可能导致操作静默的错误 丢失(如果处理程序不期待新任务并退出),崩溃 (如果有时在没有 Looper 的线程上创建处理程序 活动)或竞争条件,其中与处理程序关联的线程 与作者的预期不同。相反,使用 Executor 或 明确指定 Looper,使用 Looper#getMainLooper, {link android.view.View#getHandler},或类似的。如果隐式线程 本地行为是兼容性所必需的,请使用新的 Handler(Looper.myLooper()) 让读者明白。
目前应该如何从 Handler 更新 UI,以及是否仍应将 Handler 用于此目的。
【问题讨论】:
标签: android user-interface memory-leaks handler android-handler