【安卓】使用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”的警告,网上看了很多解 ...
随机推荐
- Windows安全加固(四)
七.服务安全 1.禁用TCP/IP上的NetBIOS(协议所用端口139) 作用:禁用TCP/IP上的NetBIOS协议,可以关闭监听的UDP137.UDP138.UDP139端口. (1)使用快捷键 ...
- 为什么在 Python 中 hash(-1) == hash(-2)?
英文:https://omairmajid.com/posts/2021-07-16-why-is-hash-in-python 作者:Omair Majid 译者:豌豆花下猫&Claude- ...
- uwp IProgress<T>进度通知。
主要是利用 Pp_ProgressChanged 报告进度: private void BtnDownload_Click(object sender, RoutedEventArgs e) { va ...
- 工作流程调度器-DolphinScheduler
1.DolphinScheduler简介 Apache DolphinScheduler](https://dolphinscheduler.apache.org/)(目前处在孵化阶段)是一个分布式. ...
- runoob-Lua 教程
https://www.runoob.com/lua/lua-tutorial.html Lua 特性 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里. ...
- nginx中的正则表达式,location路径匹配规则和优先级
前言,我这里验证的nginx-v1.23.2单机环境下的nginx中的正则表达式.location路径匹配规则和优先级. 先准备好环境,基础配置是这样 nginx/conf/conf.d/host.c ...
- pip安装MySQLdb报错mysql_config not found
报错EnvironmentError: mysql_config not found解决方法 1.sudo apt-get install python-setuptools 2.sudo apt-g ...
- Hetao P1031 萌萌题 题解 [ 蓝 ] [ 线性 dp ]
萌萌题:一道结合了观察性质的线性 dp. 观察 我们先考虑极端情况:所有数相同,所有数降序排列两种情况. 对于所有数相同的情况,我们发现,最终可以合并出来的区间,最多只有 \(n \log n\) 个 ...
- RabbitMQ(六)——路由模式
RabbitMQ系列 RabbitMQ(一)--简介 RabbitMQ(二)--模式类型 RabbitMQ(三)--简单模式 RabbitMQ(四)--工作队列模式 RabbitMQ(五)--发布订阅 ...
- WPF 调试工具使用
参考链接: https://supportcenter.devexpress.com/ticket/details/t720001/how-to-use-the-snoop-utility-to-in ...