企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
在Android开发中,编写多线程通常会使用到Thread和Handler,细心的朋友会发现,很常见的写法会被编辑器提示有问题,`new Handler(){}` 内的代码背景颜色会变成黄色。Android Studio的提示大概就是需要定义成静态之类的,以防止内存泄露问题。时间仓促,临时整理一下查到的资料,便于后续使用。 下面是网上很常见的写法: ~~~ //定义和初始化 private Handler mhandler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //处理接收到的消息 } }; //下面是调用: new Thread(){ @Override public void run() { super.run(); //做一些费时和不允许放在主线程中进行的事情 //... //事情完成后: mhandler.sendEmptyMessage(1); } }; ~~~ 那么如何解决呢? 方案一:使用软引用 ~~~ //定义和初始化 WeakReference<Handler> handler = new WeakReference<Handler>(new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); //处理接收到的消息 }); //下面是调用: new Thread(){ @Override public void run() { super.run(); //做一些费时和不允许放在主线程中进行的事情 //... //事情完成后: mhandler.get().sendEmptyMessage(1);//调用需要先get } }; ~~~ 方案二:自定义静态类 ~~~ private static class MHandler extends Handler{ private Context context; public MHandler(Context c){ context=c; } @Override public void handleMessage(Message msg) { super.handleMessage(msg); //处理接收到的消息 } } //定义 private MHandler mHandler; //初始化 mHandler = new MHandler(this); //调用 new Thread(){ @Override public void run() { super.run(); //做一些费时和不允许放在主线程中进行的事情 //... //事情完成后: mhandler.sendEmptyMessage(1); } }; ~~~ 查到的解决方案都略显麻烦,但能防止不必要的内存泄露,还是多多注意的好。