【安卓】使用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”的警告,网上看了很多解 ...
随机推荐
- CDS标准视图:催款代码描述 I_DunningKeyText
视图名称:催款代码描述 I_DunningKeyText 视图类型: 视图代码: 点击查看代码 @EndUserText.label: 'Dunning Key - Text' @Analytics. ...
- Spring 框架基础
一.Spring框架 1.框架简介 Spring是一个开源框架,框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.Spring使用基 ...
- RSA的原理和简单实践
RSA加密是一种非对称加密,原理是: 使⽤算法可以⽣成两把钥匙 A 和 B 使⽤ A 加密的信息,使⽤ B 可以解开 使⽤ B 加密的信息,使⽤ A 可以解开 ⽇常使⽤中,我们把⼀把作为公钥公开发布. ...
- ABC237
ABC237 F 题目大意 求长度为 \(n\) 且最长上升子序列长度恰好为 \(3\) 的序列 \(a\) 的个数(\(1 \leq a_i \leq m\)). 解题思路 不难判断这道题是一道线性 ...
- Vanity Intermediate 统配符提权
nmap扫描 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.167.234 Starting Nmap 7.94SVN ( https://nmap.org ) ...
- Permutation Swaps
Permutation Swaps 传送门 题目理解 第一个操作:把第i个数移到位置p[i](1<=i<=n) 发现:这个操作其实就是循环移位,有Teleporter的经验在前,此操作可 ...
- Hetao P2071 打字游戏 题解 [ 绿 ] [ 最小生成树 ] [ 动态规划 ] [ 编辑距离 ]
打字游戏:MST 套 dp 好题. 首先看这个数据范围,\(O(n^4)\) 把每两个字符串之前的编辑距离求一下很显然吧. 然后我们观察一下每一个 node 的性质,发现他要么自己打完,要么从别人那里 ...
- Log4j2 Garbage-free 无垃圾回收模式实践与总结
Log4j2 内置 Garbage-free(无垃圾)模式,可重用对象和缓冲区,减少日志记录时产生的垃圾对象,避免 JVM 进行 GC 回收,进而提升应用程序的性能与响应速度.以下以 Log4j2 的 ...
- WPF 调试工具使用
参考链接: https://supportcenter.devexpress.com/ticket/details/t720001/how-to-use-the-snoop-utility-to-in ...
- ABB机器人维修I/O通信详细解释
信号解析的深度探索与解析 在ABB机器人维修系统那精密而复杂的运作机制中,I/O(Input/Output)信号与外围机械手间的通信,是通过一种既高度组织化又精心设计的层次结构来实现的.这一结构严格遵 ...