今天花费了一天的时间来解决这个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)的更多相关文章

  1. Delphi主线程重入而导致程序卡死的解决方案

    Delphi的线程可以通过调用AThread.Synchronize(AProc),可以将Proc放入主线程中同步运行,此时AThread将挂起,直到主线程执行完AProc. 如果有BThread,调 ...

  2. RxJava开发精要7 – Schedulers-解决Android主线程问题

    原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...

  3. Java主线程等待子线程、线程池

    public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...

  4. Java并发编程原理与实战六:主线程等待子线程解决方案

    本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { Sys ...

  5. vc中主线程等待子线程退出的方法

    VC线程同步,在子线程中等待另一子线程结束,通过WaitForSingleObject可以实现,但是如果在主线程中等待子线程结束,这个函数是无法完成要求的,因为它会造成主线程挂起,导致程序死掉.我们可 ...

  6. 19 Handler 子线程向主线程发送信息

    案例一 Message创建三种方法: package com.example.day19_handler_demo1; import android.os.Bundle; import android ...

  7. java多线程实现主线程等待子线程执行完问题

    本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...

  8. Java实现主线程等待子线程

    本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...

  9. UNIX网络编程卷1 server程序设计范式8 预先创建线程,由主线程调用accept

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.程序启动阶段创建一个线程池之后仅仅让主线程调用 accept 并把客户连接传递给池中某个 ...

随机推荐

  1. jquery中选择ID以什么字符开头的匹配主要用于多个上传控件的时候,id无法使用,而且class不起作用的时候

    $("[id^=remark]")选择ID以remark开头的所有数据进行匹配

  2. nth-of-type和nth-child的区别

    看CSS3时发现了一个nth-of-type选择器,发现平时基本没见过用,就研究了一下,w3c是这样说明的: :nth-of-type(n) 选择器匹配属于父元素的特定类型的第 N 个子元素的每个元素 ...

  3. j-query j-query

    jQuery   1.安装:http://jquery.com/download/登陆这个jQuery下载2在.html文件的<head>标签中导入3 语法$(selector).acti ...

  4. MessageBox详解

    MessageBox.Show();可谓是winform开发中用的次数最多的东东啦.先贴一张msdn的图解 msdn好像没有更新哎,只提供了这几种方法,并且参数名称和最新的有差别,但实际上messag ...

  5. Eruda——手机网页前端调试面板

    前言 进行移动端网页开发时,想要查看手机浏览器信息从来都不是一件容易的事.特别是当目标环境为APP内置WebView,需要调用特定的JsBridge接口时,你根本都干不了什么,只能一遍又一遍地修改代码 ...

  6. luigi学习-luigi的配置文件

    一.luigi配置文件的加载顺序 /etc/luigi/client.cfg luigi.cfg LUIGI_CONFIG_PATH环境变量 二.配置文件分节 配置文件被分为了多个section,每一 ...

  7. Eclipse中Maven的安装

    注:初次尝试安装,配置maven,有错误望指正! 1.说明 maven.rar 是maven文件,解压即可,无需安装,但需要配置环境变量MAVEN_HOME,并放在PATH中,

  8. ThinkPHP之中的验证码的小示例

    ThinkPHP之中已经封装好了验证码的调用,但是关于手册,缺失了HTML之中以及.实际操作之中的点击ajax就会刷新验证码ajax代码:现在分享一下:看客老爷们注意啦! 放大招啦!!!三分归元气-- ...

  9. redis安装与php扩展

    redis安装:就是一个解压缩的过程 注意先运行:redis-server.exe,在运行redis-cli.exe. php扩展redis. 以上是如何选择相应的文件. 在把文件放在php/ext下 ...

  10. RAC本地数据文件迁移至ASM的方法--非归档模式

    系统环境:rhel6.2_x64+Oracle RAC11g 操作过程: 1.非归档模式 SQL> archive log list; Database log mode No Archive ...