使用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出现的警告的更多相关文章

  1. @SuppressLint("HandlerLeak"),或Handler使用有警告;

    随手写个Handler,然后飘黄,看着挺难受(黄色警告的大概意思:Handler可能会内存泄漏,推荐你用静态内部类+实例化弱引用): This Handler class should be stat ...

  2. Android中的Handler及它所引出的Looper、MessageQueue、Message

    0.引入 0.1.线程间通信的目的 首先,线程间通信要交流些什么呢? 解答这个问题要从为什么要有多线程开始,需要多线程的原因大概有这些 最早也最基本:有的任务需要大量的时间,但其实并不占用计算资源,比 ...

  3. App设计:消息推送和界面路由跳转

    概要 app消息推送.显示通知栏,点击跳转页面是很一般的功能了,下面以个推为例演示push集成,消息处理模块及app内部路由模块的简单设计. 推送 推送sdk集成 集成sdk步骤根据文档一步步做就行了 ...

  4. eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一)

    eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一) 本篇博客主要包含五个内容: 1.CXF换将搭建以及eclipse配置CXF. 2.eclipse创建w ...

  5. javascript的一些札记

    1. 原来放在不同js文件里面的$(document).ready(function(){})都会执行到. 2. $(window).scroll(function(){})  窗口滚动事件. 3.  ...

  6. [Swift通天遁地]四、网络和线程-(9)上传图片并实时显示上传进度

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. [Swift通天遁地]四、网络和线程-(13)创建一个Socket客户端

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. Spring MVC -- 转换器和格式化

    在Spring MVC -- 数据绑定和表单标签库中我们已经见证了数据绑定的威力,并学习了如何使用表单标签库中的标签.但是,Spring的数据绑定并非没有任何限制.有案例表明,Spring在如何正确绑 ...

  9. Unity 与 Android 互调用

    https://www.jianshu.com/p/b5e3cfcdf081 Unity 项目中一些需要访问安卓操作系统的功能,比如获取电量,wifi 状态等,需要 Unity 启动安卓系统的 Bro ...

  10. Android“This Handler class should be static or leaks might occur”警告的处理方法

    此文属于转载! 最近用到handle在线程中改变UI,会跟给出“This Handler class should be static or leaks might occur”的警告,网上看了很多解 ...

随机推荐

  1. UE4命令行编译工程入门

    注:本文同步发布于微信公众号:stringwu的互联网杂谈UE4命令行编译工程入门 0 背景 笔者是个UE4的小白,本文主要记录了一个小白是如何从零UE4的基础,一步步在命令行打出iOS的ipa包的尝 ...

  2. 特斯拉CEO埃隆马.斯克的五步工作法,怎么提高工程效率加速产品开发?

    简介 在<埃隆·马斯克传>这本书中,有两个章节写到了特斯拉 CEO 埃隆马斯克为了在一段时间内,提升特斯拉汽车 model 3 的产能到每个月 5000 辆这个数量级,在书中叫 " ...

  3. Spring Boot 如何使用拦截器、过滤器、监听器

    过滤器的使用 首先需要实现 Filter接口然后重写它的三个方法 init 方法:在容器中创建当前过滤器的时候自动调用 destory 方法:在容器中销毁当前过滤器的时候自动调用 doFilter 方 ...

  4. 第五章 ReentrantLock源码解析

    最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final Reentrant ...

  5. java代码之美(1)

    Lambda 一.概述 1.什么是Lambda表达式 Lambda 表达式是一种匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符.返回值声明和名字. 它可以写出更简洁.更灵活的代码.作为一种 ...

  6. Doris数据库使用

    1.表结构设置 [1]建表时指定副本数量:relication_num [2]排序键 明细模型:DUPLICATE KEY(site_id, city_code) 聚合模型:AGGREGATE KEY ...

  7. 同步一下在notion上写的内容

    之前在notion上写了一些内容,但因为notion上的编辑器和博客园的不太一样,所以不好直接搬运过来,这里同步一下链接: 之前看MIT线性代数网课做的笔记:重温线性代数 算法课笔记之一:分而治之 算 ...

  8. jenkins全局工具配置

  9. DeepSeek提示词工程完全指南:如何用「思维翻译器」激发大模型潜能——附官方提示词和优化案例

    DeepSeek提示词工程完全指南:如何用「思维翻译器」激发大模型潜能--附官方提示词和优化案例 字数:约3000字|预计阅读时间:8分钟 之前写了一篇DeepSeek-R1 技术全景解析:从原理到实 ...

  10. 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版

    一.今天发现百度搜索出现已接入DeepSeek的提示,再也不用担心使用DeepSeek时出现"服务器繁忙,请稍后再试."的问题了.   在百度搜索首页出现[即刻体验AI搜索Deep ...