【Android】解决频繁的线程请求&绘制View引发的异常问题

来源:互联网 发布:地籍数据标准 编辑:程序博客网 时间:2024/06/05 21:01

1.产生背景

在项目中需要实现一个扫描局域网设备的功能,具体的实现逻辑是这样:
  1.使用ping命令对网段尾端为1~255的设备进行扫描(判断过滤本机IP)——使用线程池控制;
  2.在ping成功后(返回值为0),开启线程发送验证消息到设备端(Socket)验证是否为可以提供服务的目标设备,如不为目标设备则无反馈,捕获Socket操作异常即可;
  3.根据返回值,记录目标设备并反馈。
为了使扫描过程交互优化,我们设计了雷达扫描效果(自定义View)实现。

2.异常出现

  在完成上述功能后,初始在大部分机器上测试显示功能正常,最近由于测试设备调整,新调拨过来的两部三星pad(OS版本4.1 4.2)在扫描界面均出现崩溃现象。查看日志发现重复进入扫描界面GC提示内存占用会越来越高(11~14MB渐增),在崩溃时报出
Skipped 491 frames! The application may be doing too much work on its main thread.它在提示我们:主线程做了太多的事情,导致了UI刷新过慢发生了失帧的情况。

3.产生原因

  通过监测应用内存(DDMS->Heap)及线程分析(DDMS->Threads)后发现是因为扫描、通讯线程同时启用过多造成的,GC提示内存占用越来越大的问题是因为在自定义View中使用了Bitmap却未及时释放资源造成的内存占比越来越大的问题(重复进入叠加);

4.解决方案

1.及时释放资源

在界面退出时,及时回收Bitmap资源,在自定义View中写出对应放在在Activity onDestory中调用即可,示例代码如下:

// 释放Bitmap资源
if (mScanBmp != null && !mScanBmp.isRecycled()) {
mScanBmp.isRecycled();
mScanBmp = null;
}

2.优化扫描、验证逻辑

分开扫描、通讯功能,完成扫后反馈扫描结果,同时开始逐个验证(每次只验证一台设备),减少线程的使用。

1 0
原创粉丝点击