【安卓】使用Handler出现的警告
使用Handler出现的警告
零、原由
安卓中使用Hander时出现了如下警告:
This Handler class should be static or leaks might occur (anonymous android.os.Handler)

网上建议使用如下方案:
private Handler mHandler2 = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return false;
}
});
但是又出现了如下警告:
'Handler(android.os.Handler.Callback)' is deprecated

都与内存泄漏有关,在API级别30中,Handler(Handler.Callback)构造函数被弃用。Android在这里解释了原因。
public Handler (Handler.Callback callback)
此构造函数已弃用。在处理程序构造期间隐式地选择一个循环器可能会导致错误,其中操作会自动丢失(如果处理程序不希望有新任务并退出)、崩溃(如果处理程序有时在thread上创建而没有活动循环器)或争用条件,threada处理程序所关联的地方并不是作者所预期的。相反,请使用执行器或显式指定循环器,使用Looper\getMainLooper、{linkandroid.view.View#getHandler}或类似的方法。如果为了兼容性需要隐式thread本地行为,请使用newHandler(Looper.myLooper(),callback)向读者说明。
壹、解决方案
使用Handler(Looper,Handler.Callback)构造函数并显式指定循环器。
案例1:如果您希望代码在main/UI thread上运行
Handler handler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
// Your code logic here
return true;
}
});
案例2:如果你想让代码在后台运行thread
// Create a background thread that has a Looper
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
// Using this handler to post tasks that running on a background thread.
Handler handler = new Handler(handlerThread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
// Your code logic here
return true;
}
});
记住完成后释放thread。
handlerThread.quit(); // 或者是 handlerThread.quitSafely();
案例3:如果希望代码在后台thread上运行,并将结果返回main/UI thread。
// Using this handler to post tasks that run on main/UI thread
Handler uiHandler = new Handler(Looper.getMainLooper());
// Create a background thread that has a Looper
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
// Using this handler to post task that run on a background thread
Handler handler = new Handler(handlerThread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
// Your code logic here
// Execute the code or pass the result back to main/UI thread
uiHandler.post(new Runnable() {
@Override
public void run() {
}
});
return true;
}
});
贰、效果
public class MainActivity extends AppCompatActivity {
private final Handler handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

已经没有警告了。
【安卓】使用Handler出现的警告的更多相关文章
- @SuppressLint("HandlerLeak"),或Handler使用有警告;
随手写个Handler,然后飘黄,看着挺难受(黄色警告的大概意思:Handler可能会内存泄漏,推荐你用静态内部类+实例化弱引用): This Handler class should be stat ...
- Android中的Handler及它所引出的Looper、MessageQueue、Message
0.引入 0.1.线程间通信的目的 首先,线程间通信要交流些什么呢? 解答这个问题要从为什么要有多线程开始,需要多线程的原因大概有这些 最早也最基本:有的任务需要大量的时间,但其实并不占用计算资源,比 ...
- App设计:消息推送和界面路由跳转
概要 app消息推送.显示通知栏,点击跳转页面是很一般的功能了,下面以个推为例演示push集成,消息处理模块及app内部路由模块的简单设计. 推送 推送sdk集成 集成sdk步骤根据文档一步步做就行了 ...
- eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一)
eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一) 本篇博客主要包含五个内容: 1.CXF换将搭建以及eclipse配置CXF. 2.eclipse创建w ...
- javascript的一些札记
1. 原来放在不同js文件里面的$(document).ready(function(){})都会执行到. 2. $(window).scroll(function(){}) 窗口滚动事件. 3. ...
- [Swift通天遁地]四、网络和线程-(9)上传图片并实时显示上传进度
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]四、网络和线程-(13)创建一个Socket客户端
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Spring MVC -- 转换器和格式化
在Spring MVC -- 数据绑定和表单标签库中我们已经见证了数据绑定的威力,并学习了如何使用表单标签库中的标签.但是,Spring的数据绑定并非没有任何限制.有案例表明,Spring在如何正确绑 ...
- Unity 与 Android 互调用
https://www.jianshu.com/p/b5e3cfcdf081 Unity 项目中一些需要访问安卓操作系统的功能,比如获取电量,wifi 状态等,需要 Unity 启动安卓系统的 Bro ...
- Android“This Handler class should be static or leaks might occur”警告的处理方法
此文属于转载! 最近用到handle在线程中改变UI,会跟给出“This Handler class should be static or leaks might occur”的警告,网上看了很多解 ...
随机推荐
- UE4命令行编译工程入门
注:本文同步发布于微信公众号:stringwu的互联网杂谈UE4命令行编译工程入门 0 背景 笔者是个UE4的小白,本文主要记录了一个小白是如何从零UE4的基础,一步步在命令行打出iOS的ipa包的尝 ...
- 特斯拉CEO埃隆马.斯克的五步工作法,怎么提高工程效率加速产品开发?
简介 在<埃隆·马斯克传>这本书中,有两个章节写到了特斯拉 CEO 埃隆马斯克为了在一段时间内,提升特斯拉汽车 model 3 的产能到每个月 5000 辆这个数量级,在书中叫 " ...
- Spring Boot 如何使用拦截器、过滤器、监听器
过滤器的使用 首先需要实现 Filter接口然后重写它的三个方法 init 方法:在容器中创建当前过滤器的时候自动调用 destory 方法:在容器中销毁当前过滤器的时候自动调用 doFilter 方 ...
- 第五章 ReentrantLock源码解析
最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final Reentrant ...
- java代码之美(1)
Lambda 一.概述 1.什么是Lambda表达式 Lambda 表达式是一种匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符.返回值声明和名字. 它可以写出更简洁.更灵活的代码.作为一种 ...
- Doris数据库使用
1.表结构设置 [1]建表时指定副本数量:relication_num [2]排序键 明细模型:DUPLICATE KEY(site_id, city_code) 聚合模型:AGGREGATE KEY ...
- 同步一下在notion上写的内容
之前在notion上写了一些内容,但因为notion上的编辑器和博客园的不太一样,所以不好直接搬运过来,这里同步一下链接: 之前看MIT线性代数网课做的笔记:重温线性代数 算法课笔记之一:分而治之 算 ...
- jenkins全局工具配置
- DeepSeek提示词工程完全指南:如何用「思维翻译器」激发大模型潜能——附官方提示词和优化案例
DeepSeek提示词工程完全指南:如何用「思维翻译器」激发大模型潜能--附官方提示词和优化案例 字数:约3000字|预计阅读时间:8分钟 之前写了一篇DeepSeek-R1 技术全景解析:从原理到实 ...
- 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版
一.今天发现百度搜索出现已接入DeepSeek的提示,再也不用担心使用DeepSeek时出现"服务器繁忙,请稍后再试."的问题了. 在百度搜索首页出现[即刻体验AI搜索Deep ...