【问题标题】:Using a Static Handler to update the UI thread使用静态处理程序更新 UI 线程
【发布时间】:2020-08-17 15:12:52
【问题描述】:

当使用后台线程工作时,通常您会通过 Handler 更新 UI。

一种方法是在类级别定义一个处理程序,如this answerthis 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 answerthis 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


    【解决方案1】:

    正如您所说的文档,它说使用Looper.getMainLooper(),只需将您的代码更改为:

    MyHandler(Type reference) {
        super(Looper.getMainLooper());
        myWeakReference = new WeakReference<Type>(reference);
    }
    

    从主/UI 线程更新 UI。

    【讨论】:

    • 我接受了这个,因为它对我有用。但我不清楚为什么可以使用 Deprecated 构造函数,即使您通过它调用超类方法。
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多