`
Teok
  • 浏览: 150344 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android开发中的一些经验总结

阅读更多

计划用这篇文章把目前我在Android领域的一些看到的、用到的、想到的经验和技巧总结一下。

1. WeakReference和AsyncTask的美妙结合

为了避免开发者在UI线程上做耗时操作,Android提供了不少异步API,其中之一就是AsyncTask。而对于某些频繁操作数据库的应用(例如,Phonebook)而言,需要一种异步的并且低耗资源的(低耗是两个方面的事情,要么是你占有的多点,但是能快速释放;要么是你本身就占有的少。这两种都可以保证其它应用有资源可用)组件。所以,那就来个WeakAsyncTask吧,唔,美妙的产物,既保证占有资源的快速释放,又保证操作是异步进行。

那为什么不是soft reference呢?

这个,来看看weak和soft两者的区别:

 

    * A SoftReference should be cleared and enqueued as late as possible, that is, in case the VM is in danger of running out of memory.

    * A WeakReference may be cleared and enqueued as soon as is known to be weakly-referenced.

不用问嘛,哪里能等到vm内存快光光的时候再去释放早已不用的资源啊,那个时候可能手机的UI看起来就卡卡的了。。

下面来看段代码:

 

public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends
        AsyncTask<Params, Progress, Result> {
    protected WeakReference<WeakTarget> mTarget;

    public WeakAsyncTask(WeakTarget target) {
        mTarget = new WeakReference<WeakTarget>(target);
    }

    /** {@inheritDoc} */
    @Override
    protected final void onPreExecute() {
        final WeakTarget target = mTarget.get();
        if (target != null) {
            this.onPreExecute(target);
        }
    }

    /** {@inheritDoc} */
    @Override
    protected final Result doInBackground(Params... params) {
        final WeakTarget target = mTarget.get();
        if (target != null) {
            return this.doInBackground(target, params);
        } else {
            return null;
        }
    }

    /** {@inheritDoc} */
    @Override
    protected final void onPostExecute(Result result) {
        final WeakTarget target = mTarget.get();
        if (target != null) {
            this.onPostExecute(target, result);
        }
    }

    protected void onPreExecute(WeakTarget target) {
        // No default action
    }

    protected abstract Result doInBackground(WeakTarget target, Params... params);

    protected void onPostExecute(WeakTarget target, Result result) {
        // No default action
    }
}

 而通常,weaktarget经常会以activity为参数,这样的话,就更为贴切的。因为context的错误引用而导致的内存溢出问题也是挺常见的。

 


2. Sqlite机制导致的饿死(ANR)
我们知道,Android的数据库是用的sqlite,而且sqlite是全局的,也就是说,对于一个Android系统实例而言,所有的程序将会共用一个sqlite database。这里就会有一个有意思的事情发生:当某个应用A正在进行某个长耗时的数据库操作时,另外一些应用B在此期间也需要进行数据库操作,但是数据库被A独占,B只能等,等着等着,超过5秒了,好吧,B被ANR了。

事实上,这种情况不总出现。前提是A的操作属于独占式的操作,B在主线程上进行数据库操作。解决方法自然也分为两种,一种是A换用批量操作API:ContentProviderOperation,用ContentProviderOperation.Builder.withYieldAllowed (true)来允许当前的数据库操作可以被挂机;另外一种是B不要在主线程里进行数据库操作。

说道这里,我更加明白了google I/O视频上那个大哥为啥说"never, never, never do slow things on UI thread"了,因为没准哪天,你就被别人ANR了。。

  

3.如何解决ANR

一个朋友去一家智能手机公司面试开发时被问到如何解决ANR的问题。正好,公司的arc前两天对解决ANR进行一些经验分享。(总结的不一定全)

1.ANR有哪几种?

从ActivityManagerService的实现可以看到,ANR有四种,分别对应Android的四个fundermetals。这个也不难理解:所有fundermetal都会在main thread上运行,如果超过了响应的间隔,那么就会ANR。另外JNI调用native函数时也会发生无响应,不过我觉得应该不算单独的一种,它只是未响应发生在了native里,而不是vm里。

2.ANR是什么?

从ActivityManagerService可以看到,作为一个manager类,要去检测所管理的对象是否处于可相应状态,一个不错的方式就是给那个对象发消息,并等待回调。事实上,就是这么做的。每隔一段时间,manager会发消息给所有fundamental,这个消息格式固定,同时带一个delay time,譬如说activity的delay time就是5000ms,当消息发出之后,5000ms之内没有收到相应,那么manager就要把那个activity ANR掉。对于broadcast receiver、provider和service也是同样的,只是delay time不一样。

以Activity为例,几个负责Activity生命周期的回调方法(以on开头的那几个),被调用后,5000ms内没有返回,那么就ANR鸟。另外还有key dispatch ANR,也就是说,当用户点击了进行了某些操作产生key event了,那么应用就必须在规定时间处理key event,如果超时,会立刻ANR。

3.ANR的导致原因

我叙述一下google I/O 2010上一个presentation上说的:就是性能问题。我们知道,一般情况下,Android系统的瓶颈经常在I/O操作,无论是本地还是网络,经常会导致程序看起来不那么顺畅,如果达到某个时间没有响应,那么就ANR鸟。我猜测,

4.如何避免ANR

"Never never never do slow things on main thread".我引用了那个presentation的原话。

5.如何解决ANR的问题

上面介绍了ANR的一些基本知识,但是在现实问题中,ANR的问题经常会比较难解决。而且每一种ANR在logcat的信息中都会有不同的。如果要了解不同ANR的特点,就需要些多个实例来观察log信息。这里需要关注的几个信息是,线程、内存、CPU、异常堆栈等信息。google貌似提供了工具来dump发生ANR时的系统及APP信息。

分享到:
评论

相关推荐

    android开发经验分享

    android开发经验总结分享,对android 开发的工程人员有帮助

    安卓航班Android开发经典教程大总结1----基础编程及源码推送

    最后,文章还推荐了一些优秀的Android项目源码,这些项目不仅可以帮助开发者更好地理解Android开发的实践,还能提供实际的编码经验。例如,新浪微博Android客户端源码、美食天下服务器源代码等,都是非常有价值的...

    android初学者入门开发经验

    标题《android初学者入门开发经验》和描述提到了Android开发中几个重要的概念,包括多线程、activity以及Android开发的基础知识。同时,给出了标签“android 多线程 activity handler gridview”。根据这些信息,...

    高通平台android开发总结

    在高通平台的Android开发中,持续集成(CI)和自动化测试至关重要。这包括建立自动化构建系统,编写测试脚本,以及使用工具如Monkey、Espresso进行功能和性能测试,确保软件的质量和稳定性。 五、安全与权限管理 ...

    阿里巴巴Android开发手册正式版1.0.1

    《阿里巴巴 Android 开发手册》是阿里巴巴集团各大 Android 开发团队的集体智慧结晶和经验总结,将淘宝、天猫、闲鱼、钉钉等 App 长期开发迭代和优化经验系统地整理成册,以指导 Android 开发者更加高效、高质量地...

    android开发总结文档

    ### Android开发总结文档知识点 #### 一、Git基础使用技巧 在进行Android开发时,版本控制工具Git的应用显得尤为重要。Git不仅可以帮助团队有效地管理代码版本,还能提高代码修改的透明度,减少因多人协作带来的...

    《Android项目开发实训》项目总结报告.pdf

    "Android 项目开发实训总结报告.pdf" 本文档总结了 Android 项目开发实训的报告,涵盖了项目概述、需求分析、相关技术、概要设计、详细设计和结论等多个方面。 第一章 概述:本章节介绍了项目的背景和需求,旨在...

    Android开发艺术探索PDF+源码+笔记

    笔记部分则是作者或读者在学习过程中对关键点的提炼和总结,可能包含一些独特的见解和经验分享,这对于初学者来说是宝贵的参考资料,能够帮助他们避免常见错误,快速掌握要点。 总的来说,这套资源对于想要深入学习...

    开发android总结文档

    在 Android 开发中,个人经验总结主要涵盖了项目构建、MVP 架构模式、MD5.0 设计规范、Lambda 表达式以及网络请求框架的选择和使用。首先,创建 Android 项目时,通常会设置最大堆内存大小,如65536K,以避免内存...

    android开发总结,实战经验

    在Android开发中,掌握核心组件是至关重要的。本篇文章将主要围绕Android的两个基础组件——Activity和Service,探讨它们的概念、功能以及生命周期管理。 Activity是Android应用中的关键组成部分,它代表了用户界面...

    android framework 经验总结

    这篇“Android Framework经验总结”将深入探讨这一关键领域的核心概念、主要组件以及常见开发实践。 1. **Android架构概述**: Android系统分为四个主要层次:Linux内核、系统库、Android运行时(ART)以及应用...

    Android十年终极开发经验_助您不走弯路_快速晋级Android架构师

    ** 行业标准: 作者有数年Android开发经验. ** 专业: 数年Android问题debug经验,Android解读专业到位 ** 咨询: 承诺文档解读有疑问,可以免费每天3个问题的解答 ** 退款: 作者承诺如果对于文档不满意,可线下联系...

    高通平台android开发总结.zip

    "高通平台Android开发总结"文档很可能是对在高通芯片上进行Android应用和系统开发经验的全面总结,提供了深入的技术见解和实践指南。下面我们将详细探讨与这个主题相关的一些关键知识点。 1. 高通平台特性: - ...

    Android开发总结笔记

    在Android开发领域,掌握核心知识点和实践经验至关重要。这篇总结笔记涵盖了Android开发的多个关键方面,旨在帮助开发者提升技能,理解Android应用的构建过程。以下是一些主要知识点的详细阐述: 1. **Android SDK*...

    android免费开发资料.zip

    这些压缩包文件包含了一系列关于Android开发的资源,涵盖了从基础到高级的各种主题,非常适合初学者和有经验的开发者提升技能。以下是对每个文件内容的详细解释: 1. **Android新手开发教程.pdf**:这个文件可能...

    Android开发经验总结20131101.pdf

    在Android开发过程中,良好的编程规范和布局设计是提高代码可读性和维护性的关键。以下是对提供的文件内容的详细总结: 1. **命名规范** - **变量命名**:对于基本数据类型的全局变量,建议采用特定前缀,如...

    【最全最详细】android开发实习报告总结 范文.pdf

    这篇实习报告中,我们可以提取出一系列关于Android开发实习和软件技术专业的关键知识点: 1. **Android开发实践**:实习生在实习期间参与了两个大项目的研发,这表明Android开发不仅仅是理论学习,更需要实践经验。...

    Android开发艺术探索-清晰PDF+随书源码+读书笔记

    《Android开发艺术探索》是一本深受Android开发者喜爱的书籍,其深入浅出地探讨了Android应用开发中的各种技术和实践。这本书不仅提供了清晰的PDF版本,方便读者电子阅读,还附带了随书源码,让读者能够直接动手实践...

Global site tag (gtag.js) - Google Analytics