13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)
今天花费了一天的时间来解决这个bug。
这种在程序运行期间出现的问题比较棘手,如果再没有规律的话就更难解决。
还好这个bug是由规律的,也就是说在程序执行半个小时左右后就会因为此异常而导致程序退出;那么在网上找了下原因,无非是说一下几点:
1、把业务放在子线程中去完成,然后通过handler来更新界面
2、通过runOnUiThread的方法来实现
再补充一点就是:优化代码,将不需要重复执行的代码执行一次就ok了,特别是需要绘制UI的代码更不能随便放在重复执行的地方
一、bug现场还原
我的程序就是类似一个会自动播放图片的网络图片浏览器
通过定时器来每隔10s去执行一次图片的网络请求,得到图片后设置为imagview将要显示的图片;通过这两步基本就完成基本需求了。
但是当程序在运行30分钟,也就是播放了100多张不同的照片后,出现了“Skipped 62 frames! The application may be doing too much work on its main thread”这样的bug,同时还伴随“GC_FOR_ALLOC freed 2755K, 18% free 13874K/16884K, paused 3753ms, total 3756ms”这样的错误
二、bug出现的原因
从报出的异常本身来说,意思就是主线程任务太重,内存耗用太多。但是我用的是BitmapUtils这个工具库,只有第一次会进行网络请求,之后就会用默认的缓存数据
所以说问题肯定不在网络请求数据这块,那就是在imageVIew设置图片资源这里。
仔细看看,不应该有问题啊,就这几个代码:
linearParams = new RelativeLayout.LayoutParams(
CommonUtils.getScreenWidth(contextShowCall), CommonUtils.getScreenHeight(contextShowCall));
imageView.setLayoutParams(linearParams);
String imgUrl = "http://"+QiNiuBucketName+".com1.z0.glb.clouddn.com/image-"+pic_casted_index+".jpg"; 6 relativeLayoutShowCall.setBackgroundDrawable(new BitmapDrawable(lastBitMap));
bitmapUtils.display(imageView, imgUrl, bigPicDisplayConfig, callback);
从代码上来看,前3行的代码,在imageView在程序其他地方没有对其修改的前提下,是不用重复设置的。将前三行代码放到程序初始化的地方,再运行程序后,发现运行2小时内暂时未发现问题。
问题锁定在了这3行代码:重复从内存中申请变量,重复设置控件的宽度和高度,再加上必须得重绘图片,对于主线程来说确实任务较重,那么通过将调整代码后确实减轻了主线程的任务量(只是重绘imageView的图片就可以了)。
总结:
1、对于在程序运行期间出现的bug,要寻找规律,寻找规律的方法之一就是在多个设备同时执行同一程序,进而快速定位错误出现的时间点和错误日志
2、最好是在程序异常时能够保证100%将异常数据发送到开发者邮箱或者管理工具,很抱歉,我还没找到一款能符合条件的(国外的mint splunk、国内的友盟都做不到100%)
3、eclipse的logcat默认只可以缓存5000条数据,可以这样设置,从而方便查看系统log:

13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)的更多相关文章
- Delphi主线程重入而导致程序卡死的解决方案
Delphi的线程可以通过调用AThread.Synchronize(AProc),可以将Proc放入主线程中同步运行,此时AThread将挂起,直到主线程执行完AProc. 如果有BThread,调 ...
- RxJava开发精要7 – Schedulers-解决Android主线程问题
原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...
- Java主线程等待子线程、线程池
public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...
- Java并发编程原理与实战六:主线程等待子线程解决方案
本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { Sys ...
- vc中主线程等待子线程退出的方法
VC线程同步,在子线程中等待另一子线程结束,通过WaitForSingleObject可以实现,但是如果在主线程中等待子线程结束,这个函数是无法完成要求的,因为它会造成主线程挂起,导致程序死掉.我们可 ...
- 19 Handler 子线程向主线程发送信息
案例一 Message创建三种方法: package com.example.day19_handler_demo1; import android.os.Bundle; import android ...
- java多线程实现主线程等待子线程执行完问题
本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...
- Java实现主线程等待子线程
本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...
- UNIX网络编程卷1 server程序设计范式8 预先创建线程,由主线程调用accept
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.程序启动阶段创建一个线程池之后仅仅让主线程调用 accept 并把客户连接传递给池中某个 ...
随机推荐
- [原]hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (这个只是题目名字) (多重背包)
本文出自:http://blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意:多重背包问题.转换成为01 ...
- 取得Android平台某设备上所有可用的Sensors
本来要写一个检测手机的温度的小应用,学习一下传感器的api,可结果怎么写不行.经检测,发现取得的Sensor为NULL,这才明白,我手机没有TYPE_AMBIENT_TEMPERATURE传感器. 于 ...
- Linux 64位编译\链接32位程序
测试机器:Ubuntu14.04 64位 gcc编译32位程序,添加参数-m32: $ gcc -c -fno-builtin -m32 TinyHelloWorld.c ld链接32位代码,添加参数 ...
- 文件上传ajaxfileupload.js插件
Html: <div class="container"> <form id="form" runat="serv ...
- PHP和AJAX笔记汇总
AJAX简介AJAX = Asynchronous JavaScript And XML(异步 JavaScript 及 XML)AJAX 是 Asynchronous JavaScript And ...
- js dom 操作
JS的DOM操作 1DOM是文档对象模型,这种模型为树模型:文档是指标签文档,对象是指文档中每个元素:模型是指抽象化的东西. 2间隔与延迟间隔执行一段代码(函数):window.setInterv ...
- C# 多线程运用
没有用过多线程,所以没有过多的了解操作原理以及怎么编写多线程 后来才只知道将一个传入的集合分别拆开为N个集合来进行使用 //分线程执行 public static void OperateThread ...
- HBase从hdfs导入数据
需求:将HDFS上的文件中的数据导入到hbase中 实现上面的需求也有两种办法,一种是自定义mr,一种是使用hbase提供好的import工具 一.hdfs中的数据是这样的 每一行的数据是这样的id ...
- JDK 环境变量的配置
小编下载的是 jdk1.6 的版本 具体如何如何安装我相信大家肯定都会的了 这里就不做详细的说明了 , 我的jdk 安装的目录是在 D:\javac 这个目录下 下面我们来配置环境变量 在我的电脑- ...
- mac虚拟机parallels 无法启动 "Windows 7" 虚拟机
关机前在虚拟机上安装了个游戏有点大,第二天开机就使用不了虚拟机了: 提示:mac虚拟机parallels 无法启动 "Windows 7" 虚拟机. 释放至少 241 MB 的 ...