使用静态处理程序更新UI线程

问题描述

在使用后台线程进行工作时,通常需要通过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的线程上创建处理程序, 活动)或竞争条件(与处理程序相关联的线程) 与作者预期的不同。相反,请使用执行程序或 使用Looper#getMainLooper明确指定Looper,{link android.view.View#getHandler}或类似名称。如果隐式线程 需要本地行为以实现兼容性,请使用new Handler(Looper.myLooper()),以使读者清楚知道。

当前应如何从Handler更新UI,以及是否仍应为此使用Handler。

解决方法

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

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

从主/ UI线程更新UI。