如何解决使用静态处理程序更新UI线程
在使用后台线程进行工作时,通常需要通过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的线程上创建处理程序, 活动)或竞争条件(与处理程序相关联的线程) 与作者预期的不同。相反,请使用执行程序或 使用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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。