10种提升android运行效率的建议

目录
  • 一、有效的线程
    • 1. 如何使用后台线程以避免前台负载过荷?
    • 2.如何避免应用不响应ANR?
    • 3. 如何在分离的线程中初始化查询?
    • 4.其他
  • 二、设备电池的优化
    • 5. 如何优化网络?
    • 6. 如何优化前台应用?
    • 7.如何优化后台运行的应用?
    • 8. 其他
  • 三、使用最少内存实现UI
    • 9. 如何分辨出布局性能问题?

如何让安卓程序在有限的内存和电池资源下流畅快速有效率的运行,下面给出了10种实践中的建议:

一、有效的线程

1. 如何使用后台线程以避免前台负载过荷?

默认情况下,应用程序的所有操作都是在前台的主线程(UI线程)上运行的,应用程序响应能力可能会受到影响,会导致当机,死机,甚至系统错误。为了提升反应能力,应该将长时间运行的任务(如网络或数据库操作,复杂的计算)搬离应用程序的主线程,切换到以一个单独的后台线程方式运行。

完成这一切换任务的最有效方法是在类级别。您可以使用AsyncTask类或IntentService类​​来组织后台工作。一旦你实现了一个IntentService,它会在需要的时候启动,使用新的一个工作线程处理请求(意图)。

当使用IntentService,你应该考虑以下限制:

  • 这个类没有把结果送给UI,所以为了显示结果,需要使用Activity
  • 一次只有一个请求被处理。
  • 任何请求处理不能中断。

2.如何避免应用不响应ANR?

为了避免应用程序长时间无应答ANR,将长任务操作从UI主线程卸载到后台线程运行,你可以通过继承AsyncTask 和实现 doInBackground() 方式来实现

另外一个方式是创建一个线程或HandlerThread 实现类,值得注意的是,你还需要规定线程的"后台" 线程权限,因为这个新线程缺省权限和UI线程是一样的,同样会拖慢整个应用运行速度。

3. 如何在分离的线程中初始化查询?

数据显示并不是即时的,尽管你使用CursorLoader 对象可以加快提速,这个对象可以在不打扰用户和Activity交互情况下,查询在后台进行。

使用这个对象武装你的应用,在对于每个ContentProvider 查询操作初始化一个单独的后台线程,然后只有在查询完成时将返回给Activity

4.其他

  • 使用StrictMode 探测UI线程中你要实现操作的潜在可能的长任务操作。
  • 使用特殊工具,如Systrace, Traceview来发现你的应用中响应瓶颈。
  • 显示操作流程图标
  • 如果初始安装非常耗时,显示启动画面。

二、设备电池的优化

主要影响电池耗电时间有:

  • 定期的唤醒更新
  • 通过3GEDGE的数据传递
  • 文本数据解析 没有JIT的正则表达式

5. 如何优化网络?

  • 如果没有连接,停止你的应用操作,只有3G或Wifi可连接时更新。
  • 选择压缩数据,比如将文本和二进制数据打包在一个请求中。
  • 使用有效率的解析器,使用流Stream解析而不是树tree解析器。
  • 减少与服务器的往返时间次数
  • 有可能对文本数据使用GZIP,充分利用CPU资源。

6. 如何优化前台应用?

  • 当设计唤醒锁时,请尽可能设置最低级别。
  • 避免潜在的Bug引起的电池消耗,使用timeout,杜绝死循环。
  • 激活android:keepScreenOn.
  • 考虑手动让GC垃圾回收Java对象,如XmlPullParserFactory BitmapFactory,对于正则使用Matcher.reset(newString) , 使用StringBuilder.setLength(0).
  • 小心同步操作synchronization ,尽管它在被UI线程驱动时是安全的。
  • ListView中要多用循环利用策略,尽量多重用一个组件
  • 尽可能使用网络定位而不是GPS,
  • onPause中一定要注销GPS更新,用户自己能在设置中激活GPS
  • 计算浮点需要很多电池,你也许要考虑地理数学等方面的精度,当在使用DisplayMetrics执行DPI tasks with .时,缓存计算结果。

7.如何优化后台运行的应用?

因为每个流程需要2M,当前台程序需要内存时需要重启,确保每个服务是短生命周期。
尽量使内存消耗低
设计应用每30分钟更新,但是只能在设备唤醒情况下。
服务Service睡眠是不好的,应答使用AlarmManager<receiver>这样manifest元素,当完成时调用stopSelf() ,当启动服务时,使用AlarmManager,使用*_WAKEUP要注意,通过setInexactRepeating()进行复位让安卓能包装你的应用更新,当使用<receiver>时,动态地在manifest中激活或失效其组件,特别是空操作情况下。

8. 其他

  • 在进行一个完整更新之前,检查电池和网络状态,进行批量处理时要等待电池较好的状态
  • 提供用户电池使用情况的可选项,以决定更新周期和后台行为。

三、使用最少内存实现UI

9. 如何分辨出布局性能问题?

当你使用布局管理器创建页面时,你可能会引入一些延迟,为了实现平衡 内存消耗少的UI,你需要搜查布局中潜在的性能瓶颈,可以使用安卓SDK目录<sdk>/tools/下的Hierarchy Viewer 工具。

另外一个发现性能巍峨提的工具是Lint,它能扫描应用源码中层次寻找Bug

10. 如何解决性能问题?

你可以通过压扁层次比如通过从LinearLayout 类转换到使用RelativeLayout类,压低层次水平。

到此这篇关于10种提升android运行效率的建议的文章就介绍到这了,更多相关提升android运行效率的建议内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android Studio真机无线连接USB设备调试运行详解流程

    前言 一般情况下,多数移动开发者使用的是数据线连接电脑,进行各种移动设备的调试,更有胜者,非常迷恋模拟器,模拟器它好不好,答案是好,因为直接运行在电脑上,直接操作,调试,确实方便.尤其是ios开发小伙伴,多数app通过模拟器基本上都能开发好,再用真机验证就可以了.但对于android,就比较恼火了,模拟器一直不好用,卡.慢都是影响撸码的心情.另外android设备随便弄个便宜的都是容易的,基本上是真机开发.那么非一般情况呢,例如我们使用了NDK也就是C层的代码时,由于架构匹配方面,需要用真机开发

  • Android 7.0 运行时权限弹窗问题的解决

    Android 7.0系统在运行应用的时候,对权限做了诸多限制,normal, dangerous, signature, signatureOrSystem ,取决于保护级别,在确定是否授予权限时,系统可能采取不同的操作. normal 表示权限是低风险的,不会对系统.用户或其他应用程序造成危害: dangerous 表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限: signature 表示只有当应用程序所用数字签名与声明引权限的应用程序所用数字签名相同时,才能将权限授给它

  • Android Studio 运行按钮灰色的完美解决方法

    今天新建项目的时候突然发现编译后运行按钮为灰色. 解决方案: 第一步:点击图中的Add Configuration,出来如下界面 第二步:点+号,并选择Android App选项 出来下图所示界面 第三步:在Module 中下拉框中选择app 如果在Module 下拉框没有app这个选项 点击搜索框,输入sync,从搜索结果中选择如下项: 点击运行 然后就可以在Module下拉框中发现app这个选项了. 第四步: 点击Add Configuratio 选择app ,运行按钮就可以用啦. 到此这篇

  • Android studio 运行main 函数的方法

    标题Gradle构建问题 切换到Project工程下.idea/gradle.xml添加属性 <option name="delegatedBuild" value="false" /> 图例 PS:下面通过示例代码看下JAVA中的main函数 package com.han; public class HanTest { public static void main(String[] args){ if(args==null){ throw new

  • 解决AndroidStudio无法运行java中的mian方法问题

    前言: 我们都知道Android开发者的必备工具:AndroidStudio.是开发人员用来编译.测试的专用工具.今天在使用Androidstudio时发现了些问题.在3.0版本之前是可以直接运行mian方法来测试的. 今天写了一个java文件准备运行着mian方法时却突然报错了,本想着是升级到4.1版本的问题?后来找到了问题所在,默认配置问题. 如下图: 系统提示app配置有误,无法创建mian方法的task. 解决方案: 修改idea目录下的gradle.xml文件. 现gradle.xml

  • Android运行时权限终极方案(PermissionX)

    各位小伙伴们大家早上好,不知道你的<第三行代码>已经读到哪里了? 有些朋友的阅读速度真是令人印象深刻,我记得在<第三行代码>刚刚发售一周不到的时间里,竟然就有人已经读到第9章了(因为公众号后台有人回复第9章里隐藏的关键字).现在,<第三行代码>已经出版一个月有余了,相信已经有不少朋友将全本书都看完了. 全书都看完的朋友一定知道,<第三行代码>的最后一章是带着大家一起开发了一个开源库:PermissionX.这一章的主旨是为了让你了解一个开源库整体的开发与发布

  • Android进程运行中权限被收回导致关闭的问题解决

    流程如图: MainActivity 跳转至 MainActivity2 再跳转至 MainActivity3MainActivity3 跳转至 设置,收回权限 一路返回 运行log如下 // 一路跳转,打开设置,收回权限 com.miss.soullink E/MainActivity: == onCreate == 25149 com.miss.soullink E/MainActivity: == onCreate == savedInstanceState null com.miss.s

  • Android如何让APP无法在指定的系统版本上运行(实现方法)

    随着市面上越来越多三方APP的出现,某些手机厂商也开始对这些APP进行了安装限制或者运行限制,或者三方APP自身的版本过低,无法被特定的系统版本所支持. 今天我将要模拟实现一个"由于APP自身版本过低.导致无法在当前的系统版本上运行"的功能效果. 实现思路如下: 要获得APP的目标运行版本,也要知道系统的编译版本 通过版本比较,在进入该APP时,给用户做出"不支持运行"的提示 用户确认提示后,直接退出该APP 关键点是 targetSdkVersion 的使用,源码

  • Android Studio用genymotion运行后小图标无法显示问题

    提出问题 我做的是一个通讯录,用到了选项菜单,每一个菜单项左边我都添加了一个小图标,运行后发现没有显示出来. 解决方案 利用反射机制,根据对象来寻找类,再根据类来找方法,在显示菜单选项的Activity中复写onMenuOpened方法: @Override public boolean onMenuOpened(int featureId, Menu menu) { if(menu!=null){ if(menu.getClass().getSimpleName().equalsIgnoreC

  • 10种提升android运行效率的建议

    目录 一.有效的线程 1. 如何使用后台线程以避免前台负载过荷? 2.如何避免应用不响应ANR? 3. 如何在分离的线程中初始化查询? 4.其他 二.设备电池的优化 5. 如何优化网络? 6. 如何优化前台应用? 7.如何优化后台运行的应用? 8. 其他 三.使用最少内存实现UI 9. 如何分辨出布局性能问题? 如何让安卓程序在有限的内存和电池资源下流畅快速有效率的运行,下面给出了10种实践中的建议: 一.有效的线程 1. 如何使用后台线程以避免前台负载过荷? 默认情况下,应用程序的所有操作都是

  • 使用Composing builds提升Android编译速度

    目录 前言 Composing builds 和 buildSrc 对比 什么是 buildSrc 什么是 Composing builds buildSrc vs Composing builds 编译速度 它们在使用上有什么不同呢 总结 结语 前言 长期以来困扰我们的一个问题就是构建速度,AndroidStudio 的构建速度严重影响 Android 开发者的工作效率,尤其是更新一个版本号,导致整个项目重新构建,在网络慢的情况下,这是无法忍受的. buildSrc 这种方式,在最近几年是非常

  • Java开发者推荐的10种常用工具

    以下是Java程序员在日常生活中最常用的10种工具.如果你正在使用Java,本文介绍将会对你有所帮助,如果你还不熟悉这些工具,在这里你可以对它们进行更加系统的了解. 1) IDE:Eclipse和NetBeans IDE是Java开发人员最为重要的工具.IDE不仅提供了集成的开发环境,还能够帮助导航.调试和记录代码.Eclipse作为行业领导者,有一半的Java开发人员都在使用它.而在编写测试程序.测试和调试Java web开发的新事物方面,我更推崇Netbeans,这是因为在web开发方面Ne

  • Linux下命令行cURL的10种常见用法示例

    前言 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具. 语法: # curl [option] [url] 本文主要跟大家分享了Linux命令行cURL的10种常见用法,分享出来供大家参考学习,下面来一起看看详细的介绍: 1. 获取页面内容 当我们不加任何选项使用 curl 时,默认会发送 GET 请求来获取链接内容到标准输出. curl http://www

  • 利用Numba与Cython结合提升python运行效率详解

    目录 Numba Numba 模式 什么是LLVM? Numba的优势: Numba的劣势: Cython Cython的优势: Cython的劣势: Numba 对 Cython Numba Numba是一个即时(JIT)编译器,它将Python代码转换为用于CPU和GPU的本地机器指令.代码可以在导入时.运行时或提前编译. 通过使用jit装饰器,使用Numba非常容易: 正如你所知道的,在Python中,所有代码块都被编译成字节码: 代码优化 为了优化Python代码,Numba从提供的函数

  • React中10种Hook的使用介绍

    目录 React Hook是什么? React目前提供的Hook 1.useState 2.useEffect & useLayoutEffect 3.useMemo & useCallback 4.useRef 5.useContext 6.useReducer React Hook是什么? React官网是这么介绍的: Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 完全可选的 你无需重写任何已有

  • Vue3的10种组件通信方式总结

    目录 引言 Props emits expose/ref Non-Props 单个根元素的情况 多个元素的情况 v-model 单值的情况 多个v-model绑定 v-model修饰符 插槽slot 默认插槽 具名插槽 作用域插槽 provide/inject 总线bus getCurrentInstance Vuex 安装 使用 State Getter Mutation Action Module Pinia 安装 注册 在组件中使用 啰嗦两句 mitt.js 安装 使用 总结 引言 本文讲

  • Vue2和Vue3的10种组件通信方式梳理

    目录 props emit attrs和listeners provide/inject parent/children expose&ref EventBus/mitt 写在最后 Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异:本文将通过选项式API 组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式. 其中将要实现的通信方式如下表所示: 方式 Vue2 Vue3 父传子 props props 子传父 $emit emits 父传子

  • js从10种颜色中随机取色实现每次取出不同的颜色

    昨天在做js 从10种颜色中随机取色,并每次取出的颜色不同的时候,考虑了很多,最终用如下来实现: 复制代码 代码如下: var colorList = ["#FFFF99","#B5FF91","#94DBFF","#FFBAFF","#FFBD9D","#C7A3ED","#CC9898","#8AC007","#CCC007"

  • 分享Linux 系统生成随机密码的10种方法

    通常情况下大家生成密码都好困惑,一来复杂程度不够会不安全,复杂程度够了又不能手动随便敲击键盘打出一同字符(但通常情况下这些字符是有规律的),使用1password 或者 keepass 这种软件生成也可以,不过貌似1password 要收费,既然这样我们就玩一下好玩的用 linux 来生成随机密码玩玩吧; Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,

随机推荐