Android 代码优化

Android代码优化工具 1.前言:在我们平时项目开发中,经常会写一些不严谨的代码或者一些比较低级的错误代码,但是这些错误往往很难被发现,这样就导致了我们的项目中会隐藏了很多影响性能甚至是导致闪退的错误代码,于是许多响应的检测工具就出现了.在这里我就介绍一下我比较常用的几个检测工具吧项目DEMO源码2.FindBugs顾名思义,FindBugs是一个寻找bug的工具,更具体的说FindBugs是一个静态检测java代码的工具 阅读详情

Android 代码优化


有这样一个话题在 StackOverflow: 上提起过:

What is the best way to retain active objects—such as running Threads, Sockets, and AsyncTasks—across device configuration changes?

简单的说: AnsyncTask & Socket & Thread 当Configuration改变的时候该如何处理?

回答这个问题前,先来讨论一下Android开发如何在Activity生命周期中处理长时间后台任务,然后再提出两种处理方法的缺陷,最后给出简单的推荐处理方式。

假定,Activity启动一个后台AnsyncTask,当用户旋转屏幕以后,Activity会销毁和重建,当 AsyncTask 最终完成其工作时,它将错误地将结果返回到旧的Activity实例,完全没有意识到已创建一个新的Activity。好像这并不是神马问题,因为新的Activity可以从新发起AsyncTask,即使这被认为是浪费资源,因为新的Activity完全没有意识到已经有AsyncTask实例在运行。

基于以上原因,当Configuration改变的时候,正确有效的保存Activity实例可以节约必要的资源。

保存Activity实例-不推荐

通过修改Android manifest的configChanges 属性可以禁止销毁和重建Activity当Configuration改变的时候,这个是解决这类问题最普遍的做法。这个方法看似相当简单,所以大部分Android开发人员特别热衷这么做。然而Google的工程师们,并不推荐这么做。
主要有以下原因:

  • Configuration改变以后,UI需要和Device的Configuration同步,如果你一个不小心,那么UI就会出现问题。因为此时Device的Configuration改变了,而你的UI却尚未同步改变。
  • 一些Android开发人员错误认为设置android:configChanges=”orientation” 会确保禁用销毁和重建Activity,而实际上并非如此,因为到时Configuration改变可能有许多原因,不仅仅局限在旋转屏幕,还有可能是当你改变程序的默认语言,或者将设备和其他显示设备相连的时候,这些都可能引起Configuration的改变。

基于以上原因,在Android manifest设置configChanges 属性并非明智之举。

重写 onRetainNonConfigurationInstance()-不推荐

在Activity实例之间传递对象比较推荐的方法是通过重写onRetainNonConfigurationInstance() 和 getLastNonConfigurationInstance() 方法,然而这在API13以后废弃了,因为有更好的方法可以替代上面的重写方法。那么该如何处理上面的问题呢?

保持Activity内部的Fragment实例-推荐

自从Android 3.0引入Fragment以后,在Activity实例之间传递对象的推荐方法变成了保持Activity内部的Fragment实例,因为默认情况下,Fragment的生命周期是和它依附的Activity生命周期同步的。通过调用* Fragment#setRetainInstance(true)* 可以帮助我们绕过销毁-重建实例的周期,直接得到例如AnsyncTask & Socket & Thread等的引用。
下面是个简单的例子:

MainActivity.java

/**
 * This Activity displays the screen's UI, creates a TaskFragment
 * to manage the task, and receives progress updates and results 
 * from the TaskFragment when they occur.
 */
public class MainActivity extends Activity implements TaskFragment.TaskCallbacks {

  private static final String TAG_TASK_FRAGMENT = "task_fragment";

  private TaskFragment mTaskFragment;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager fm = getFragmentManager();
    mTaskFragment = (TaskFragment) fm.findFragmentByTag(TAG_TASK_FRAGMENT);

    // If the Fragment is non-null, then it is currently being
    // retained across a configuration change.
    if (mTaskFragment == null) {
      mTaskFragment = new TaskFragment();
      fm.beginTransaction().add(mTaskFragment, TAG_TASK_FRAGMENT).commit();
    }

    // TODO: initialize views, restore saved state, etc.
  }

  // The four methods below are called by the TaskFragment when new
  // progress updates or results are available. The MainActivity 
  // should respond by updating its UI to indicate the change.

  @Override
  public void onPreExecute() { ... }

  @Override
  public void onProgressUpdate(int percent) { ... }

  @Override
  public void onCancelled() { ... }

  @Override
  public void onPostExecute() { ... }
}

TaskFragment.java

/**
 * This Fragment manages a single background task and retains 
 * itself across configuration changes.
 */
public class TaskFragment extends Fragment {

  /**
   * Callback interface through which the fragment will report the
   * task's progress and results back to the Activity.
   */
  interface TaskCallbacks {
    void onPreExecute();
    void onProgressUpdate(int percent);
    void onCancelled();
    void onPostExecute();
  }

  private TaskCallbacks mCallbacks;
  private DummyTask mTask;

  /**
   * Hold a reference to the parent Activity so we can report the
   * task's current progress and results. The Android framework 
   * will pass us a reference to the newly created Activity after 
   * each configuration change.
   */
  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
    mCallbacks = (TaskCallbacks) activity;
  }

  /**
   * This method will only be called once when the retained
   * Fragment is first created.
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Retain this fragment across configuration changes.
    setRetainInstance(true);

    // Create and execute the background task.
    mTask = new DummyTask();
    mTask.execute();
  }

  /**
   * Set the callback to null so we don't accidentally leak the 
   * Activity instance.
   */
  @Override
  public void onDetach() {
    super.onDetach();
    mCallbacks = null;
  }

  /**
   * A dummy task that performs some (dumb) background work and
   * proxies progress updates and results back to the Activity.
   *
   * Note that we need to check if the callbacks are null in each
   * method in case they are invoked after the Activity's and
   * Fragment's onDestroy() method have been called.
   */
  private class DummyTask extends AsyncTask<Void, Integer, Void> {

    @Override
    protected void onPreExecute() {
      if (mCallbacks != null) {
        mCallbacks.onPreExecute();
      }
    }

    /**
     * Note that we do NOT call the callback object's methods
     * directly from the background thread, as this could result 
     * in a race condition.
     */
    @Override
    protected Void doInBackground(Void... ignore) {
      for (int i = 0; !isCancelled() && i < 100; i++) {
        SystemClock.sleep(100);
        publishProgress(i);
      }
      return null;
    }

    @Override
    protected void onProgressUpdate(Integer... percent) {
      if (mCallbacks != null) {
        mCallbacks.onProgressUpdate(percent[0]);
      }
    }

    @Override
    protected void onCancelled() {
      if (mCallbacks != null) {
        mCallbacks.onCancelled();
      }
    }

    @Override
    protected void onPostExecute(Void ignore) {
      if (mCallbacks != null) {
        mCallbacks.onPostExecute();
      }
    }
  }
}

对上面的简单Demo说明一下:
当MainActivity第一次创建时,将一并创建Fragment实例,并加入到MainActivity状态中去,Fragment创建AsyncTask,并通过CallBack回调将结果通知到MainActivity中去,而当COnfiguration改变以后,MainActivity经过正常的生命周期,而新的MainActivity实例会在OnCreate()方法中得到Fragment之前的引用,而在Fragment中,onAttach(Activity activity)方法会得到最新的Activity引用,二者之间都同步更新,有效避免了资源浪费和解决了因Configuration改变带来的问题。

这个简单的Demo是可靠的,从此不用再担心无法预料的Configuration改变带来的问题。

移动开发中的 Android Jetpack 代码优化策略 本文旨在为Android开发者提供一套完整的Jetpack代码优化策略,帮助开发者理解Jetpack组件的工作原理,并掌握在实际项目中进行性能优化的具体方法。我们将重点讨论Jetpack架构组件、数据库访问、后台任务处理等核心模块的优化技巧。文章首先介绍Jetpack的核心概念,然后深入分析各组件优化策略,接着通过实际案例展示优化方法,最后讨论实际应用场景和未来发展趋势。Jetpack: Google提供的一套库、工具和指南集合,帮助开发者遵循最佳实践,减少样板代码ViewModel。 阅读详情

相关推荐

多期DID实战指南:从CSDID原理到分组加权策略

本文深入解析多期DID(CSDID方法)在政策评估中的实战应用,从核心思想到分组加权策略全面讲解。通过电商扶贫等案例,详细演示如何正确处理分批实施政策的数据分析,包括分组拆解、子模块DID操作及加权平均选择,帮助研究者规避常见误区,提升政策评估的准确性。

weixin_26833503的博客 524

Android平台上进行代码优化

合理安排UI更新,利用`Handler`、`Choreographer`或者`RecyclerView`的动画机制,避免过于频繁地刷新界面。- 适当使用弱引用、软引用以及生命周期感知组件,如`LiveData`和`ViewModel`,以适应组件生命周期的变化。- 控制内存分配,特别是在循环中避免创建大量临时对象,考虑使用局部变量、数组缓冲区等手段。- 优化算法,减少不必要的计算和循环,尤其是对于大量数据或频繁执行的操作。- 使用索引、合理设计表结构,并优化SQL查询语句,减少数据库查询时间。

weixin_34991050的博客 409

LTE随机接入实战:如何通过PRACH前导码优化小区覆盖半径(附计算公式)

本文深入探讨了LTE网络中PRACH前导码格式对小区覆盖半径的关键影响。通过解析不同前导码格式(如Format 0-3)的物理参数与覆盖能力,提供了核心计算公式与实战Python脚本,指导网络工程师根据覆盖需求、环境多径和容量等因素,科学选择前导码格式以优化边缘用户接入成功率,实现精准的网络规划与优化。

qq_27496129的博客 574

android代码优化

通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的。一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构。重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能。下面我们就从几个方面来了解Android开发过程中的代码优化。 1)静态变量引起内存泄露 在代码优化的过程中,我们需要对代码中的静态变量特别留意。静态变量

认真做事,开心生活 776

攻防世界 misc题GFSJ1129-【您看我还有机会吗?】

我们发现了隐藏内容,一开始我以为那个英文就是flag,提交后发现不对,然后我想只有一张图片然后图片上的隐写内容又不是flag,那必定还有什么文件被隐藏了,于是我们打开VMware并启动Ubuntu,使用binwalk分析一下有没有隐藏文件,我们要在Terminal中分析,如下。我们发现里面有一个flag.txt文件,我们尝试提取里面内容,但发现又要密码,我们想起了之前图片上的隐藏内容,我们将那段英文输入(包括空格和符号,在VMware中输入密码不会有显示,你看到的就像没输入一样),然后我们看到如下。

大数据专业,关注 AI 安全与数学建模。记录 Web 安全、对抗攻击、隐私保护等安全实践,以及从经典模型到智能方法的建模思考。用数学思维理解 AI,用 AI 方法反哺安全与建模。 1094

从零到一:RJ71EN71 ModbusTCP配置的避坑指南与实战技巧

本文详细解析三菱RJ71EN71模块的ModbusTCP配置全流程,涵盖GX Works3参数设置、地址映射、通信调试等核心环节。针对工业环境中常见的IP冲突、软元件分配错误、通信超时等高频问题提供实战解决方案,帮助工程师快速构建高可靠性通信网络,避免项目延期风险。

zzz56的博客 331

Android优化浅谈之Java代码优化

Android优化包括许多方面,就从Java代码优化、内存泄露、UI优化等几个方面来介绍一下。今天主要介绍一下Java代码优化。   Java代码优化:Java代码优化主要是要一些Java的编程技巧和优化原则。 1、尽量使用static和final修饰符:使用static修饰符可以调高调用的效率且减少空间占用。final变量的值不可被修改、不可被覆盖、不可派生,适当地使用final不仅可以保护

潘洪金的博客 1216

DeepSeek研发的精算大模型「精卫」已实现98%精算任务覆盖,中国人寿采用后年节约3.2亿元技术采购成本,形成关键技术替代效应

根据现有资料,精算领域关键技术替代效应的行业标准定义尚未明确具体提及。然而,可以从相关文献中提取一些关键概念和方法来推导出可能的定义。​替代效应的基本定义​:替代效应是指一种商品价格变动引起另一种商品的相对价格变动,从而导致消费者在维持原有效用水平不变的条件下对商品需求量做出的调整。​技术替代效应​:在精算领域,技术替代效应可以理解为新技术或新方法对现有技术或方法的替代,从而影响精算模型、数据处理和决策过程。例如,机器学习在精算中的应用日益增长,改变了精算师的工作方式和模型构建方法。​。

百态·数智思维 | 聚焦大数据、量化与未来AI 1711

Android代码优化

Android代码优化的核心原则:不做不必要的事,不分配不必要的内存1、字符串频繁操作时,多用StringBuffer而少用String2、尽量使用本地变量,即反复使用的变量要先保存成临时或局部变量,尤其是循环中使用的变量3、String方法中substring和indexOf都

JavaTiger 1730

SAP 销售订单及发票 利润中心替代 Userexit出口 配置及程序

在跨公司销售业务中,跨公司销售订单的发票时无法从销售订单中将利润中心带到发票中,所以在跨公司的发票创建过程中需要配置出口来获取对应销售订单行项目的利润中心。 事务代码: 0KEM 配置步骤: 1、创建一个新的替代 2、创建一个步骤 3、维护一个先决条件,比如针对于特定工厂 PCASUB-VKBUR = '0001' 4、选择替代程序FORM,FORM必须为指定程序中存在的FORM名 5、编辑替代程序FORM 实现效果: 在程序FORM中打上断点 ...

李威威wiwi的博客 5069

I-Cache 和 D-Cache

I-Cache 和 D-Cache

liuyuanbin9001 7022

android 代码优化

Android代码优化的核心原则:不做不必要的事,不分配不必要的内存 1、字符串频繁操作时,多用StringBuffer而少用String 2、尽量使用本地变量,即反复使用的变量要先保存成临时或局部变量,尤其是循环中使用的变量 3、String方法中substring和indexOf都是native方法可以大量的使用 4、如果函数返回String类型,而且返回后的使用就是要加入到Strin

shenyuemei的专栏 643

【个人学习总结】CRC校验原理及实现

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ..................

星Yeah 的博客 7967

Android代码优化工具——Android lint

作为移动应用开发者,我们总希望发布的APK文件越小越好,不希望没有用到的图片资源也被打包进去,不希望应用中使用了高于minSdk的API,也不希望Manifest文件存在异常,lint就能解决我们的这些问题。Android lint是在ADT 16提供的新工具,它是一个代码扫描工具,能够帮助我们识别代码结构存在的问题,主要包括: 布局性能(以前是layoutopt工具,可以解决无用布局、嵌套

choubaoguai的专栏 580

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android中的代码优化

Android代码优化的核心原则:不做不必要的事,不分配不必要的内存 1、字符串频繁操作时,多用StringBuffer而少用String 2、尽量使用本地变量,即反复使用的变量要先保存成临时或局部变量,尤其是循环中使用的变量 3、String方法中substring和indexOf都是native方法可以大量的使用 4、如果函数返回String类型,而且返回后的使用就是要加入到Str

zhengzhihao1的专栏 769

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android-一些关于代码优化的事儿

Android-一些关于代码优化的事儿 内容来自这里:http://www.madhome.org/read.php?tid=1769 直接引用了,唉,看来有不少细节要注意。 简介 对于占用资源的系统,有两条基本原则:不要做不必要的事 不要分配不必要的内存 所有下面的内容都遵照这两个原则。 有些人可能马上会跳出来,把本节的大部分内容归于“草率的优化”(参见[The Root of

阿赞的专栏 468

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

安卓代码优化

 我们的目标是写出更加高效的代码。根据Android官方的建议,编写高效代码的两个基本准则如下:.不要做冗余的工作。.尽量避免次数过多的内存分配操作。其实还要加上第三个准则:深入的理解所用语言特性和系统平台的API,具体到Android开发,就是要熟练掌握Java语言,并对Android SDK 所提供的API了如指掌。1.数据结构的选择2.Handler和内部类的正确用法3.正确的使用Conte...

Q 的博客 2612

Android 代码优化技术点总结

前言 清理操作 页面退出时是否完成必要的清理操作 数据库的游标是否已经关闭前言 本文收集了我自己工作以来提交代码前的所有检查点。事实证明,这样能有效提高自己的代码质量和功能的稳定性。所以推荐大家以后每次提交代码前,都可以看下这份Review清单哈。 清理操作页面退出时,是否完成必要的清理操作? 是否调用Handler的removeCallbacksAndMessages(null)来清空Hand

wanlaihuan的博客 313

关于Android布局优化和代码优化的建议

关于Android布局优化和代码优化的建议 这篇文章主要是和大家分享关于Android布局优化和代码优化的一些建议,希望能对大家有所帮助,以及促进和大家的交流学习。 一、布局优化 1.1 include优化 重用布局文件 标签可以允许在一个布局当中引入另一个布局,那么比如说我们程序的所有界面都有一个公共的部分,这个时候最好的做法就是将这个公共的部分提取到一个独立的布局中,然...

weixin_45365889的博客 597

android如何优化代码,Android优化技术(一)之代码优化篇

从今天开始我们将进行Android优化技术方面的总结,我们将从不同的视角进行优化技术的分析总结。这一篇是从代码视角进行优化,这些都是平时编码中总结的经验,如有错误或更好的方法建议欢迎各位批评指证。接下来,让我们进入主题吧。一、循环的优化1、不要在for循环的第二部分语句调用函数在开发过程中,我们经常会用for循环来遍历数组操作,在程序中我们有可能会这样写:for(int i = 0;i < ...

weixin_30197529的博客 848

android 字符串数组_关于Android布局优化和代码优化的建议

写在前面:一名有三年Android开发经验的女程序员(欢迎大家关注我 ~期待和大家一起交流和学习Android的相关知识)这篇文章主要是和大家分享关于Android布局优化和代码优化的一些建议,希望能对大家有所帮助,以及促进和大家的交流学习。一、布局优化1.1 include优化重用布局文件标签可以允许在一个布局当中引入另一个布局,那么比如说我们程序的所有界面都有一个公共的部分,这个时候最好的做法...

weixin_28733637的博客 137
上一篇: Android BroadCast (一)
下一篇: 树的层序遍历
linroidh
博客等级 码龄16年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值