Android's Dalvik Java 与 Java SE 进行比较
Java代码优化
内存管理与分配
Android的多线程操作

Android’s Dalvik Java 与 Java SE 进行比较:

@、Dalvik虚拟机是register-based machine;Java SE虚拟机是stack machine。

@、从Android 2.2 版本开始引进JIT(Just In Time)编译器,之前是纯解释器。

@、Android SDK 使用dx这个工具把Java SE stack machine byte-code 转换为 Dalvik register-based machine byte-code.(IDE自动完成此步骤)

@、Dalvik VM 能够在同一个虚拟机上运行多个实例(running in multiple instances on the same machine.)。系统启动时开启第一个实例,叫做zygote,它控制了其它所有实例。

Java代码优化:

@、java.util.concurrent包中有许多已经实现并发控制的类,因此,在写代码前先确认下是否有满足需求的类而不是直接去自定义一个类来控制并发。

@、java.util.concurrent.locks包中提供了读写锁的控制类(ReentrantReadWriteLock),而不需要通过使用synchronized来保证线程安全。

内存管理与分配:

@、不要在循环中创建新对象,这样会给GC带来过度的开销。

@、通过static factory method方式来实现按需分配对象。可参考书籍《Effective Java》,或者可参考Android源码中Message、MotionEvent、Parcel等类的实现方式。

Android的多线程操作:

@Thread:

1、  直接继承Thread类。

2、  实现Runnable接口。通过Activity的runOnUiThread方法实现与主线程的交互。

3、  因为start方法一个Thread实例只能调用一次,所以需要每次都创建Thread对象来完成操作。这样带来了过多的开销,因此不推荐使用此方法。

@、AsynTask:

1、  onPreExecute、doInBackground、onProgressUpdate、onPostExecute。

2、  onXXX都是在主线程执行,doInBackground不是。

3、  在doInBackground中调用publishProgress方法来触发onProgressUpdate事件。

4、  此方式的产生的实际线程是由ExecutorService在后台管理。

5、  此方式很容易就实现在独立的线程里完成长时间操作,而不影响主线程。

6、  此方式每次操作都需要创建新的对象,因此不适合需要频繁调用的场景,否则增加GC的开销。适合类型文件下载这样不频繁的操作。

@、Handler:

1、  Acitvity实现Handler.Callback接口,在handleMessage方法中完成需要的操作,可通过方法入参message的what字段作为switch-case语句的标志,来完成不同的操作。注意;在方法的末尾加上message.recycle(); 这样就可以重用Message实例,而不要重复创建过多的Message实例。

2、  创建HandlerThread对象(handlerThread)。

3、  创建Handler对象(mHandler = new Handler(handlerThread.getLooper(),this))。

注:2、3步骤可在onCreate实现。

4、  线程有Looper类进行维护,循环执行,直到手动执行终止(可在onPause事件中调用mHandle.getLooper().quit())。

5、  需要与主线程交互的,可以在增加一个Handler对象(mMainHandler = new Handler(getLooper(), this))负责与主线程的交互。

6、  通过Handler的各种sendXXX方法完成消息传递,最终由handleMessage方法完成对消息的操作。

Android Programming: Pushing the Limits -- Chapter 2: Efficient Java Code for Android的更多相关文章

  1. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- ApiWrapper

    前面两片文章讲解了通过AIDL和Messenger两种方式实现Android IPC.而本文所讲的并不是第三种IPC方式,而是对前面两种方式进行封装,这样我们就不用直接把Aidl文件,java文件拷贝 ...

  2. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger

    Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...

  3. Android Programming: Pushing the Limits -- Chapter 5: Android User Interface Operations

    多屏幕 自定义View 多屏幕 @.Android 4.2 开始支持多屏幕. @.举例: public class SecondDisplayDemo extends Activity { priva ...

  4. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- AIDL

    服务端: 最终项目结构: 这个项目中,我们将用到自定义类CustomData作为服务端与客户端传递的数据. Step 1:创建CustomData类 package com.ldb.android.e ...

  5. Android Programming: Pushing the Limits -- Chapter 4: Android User Experience and Interface Design

    User Stories Android UI Design 附加资源 User Stories: @.通过写故事来设计应用. @.每个故事只关注一件事. @.不同的故事可能使用相同的组件,因此尽早地 ...

  6. Android Programming: Pushing the Limits -- Chapter 3: Components, Manifests, and Resources

    Android Components Manifest文件 Resource and Assets v\:* {behavior:url(#default#VML);} o\:* {behavior: ...

  7. Android Programming: Pushing the Limits -- Chapter 1: Fine-Tuning Your Development Environment

    ADB命令 Application Exerciser Monkey Gradle ProGuard 代码重用 版本控制 静态代码分析 代码重构 开发者模式   ADB命令: @.adb help:查 ...

  8. Android Programming: Pushing the Limits -- Chapter 6: Services and Background Tasks

    什么时候使用Service 服务类型 开启服务 后台运行 服务通信 附加资源 什么时候使用Service: @.任何与用户界面无关的操作,可移到后台线程,然后由一个Service来控制这个线程. 服务 ...

  9. [iOS翻译]《iOS 7 Programming Pushing the Limits》系列:你可能不知道的Objective-C技巧

    简介: 如果你阅读这本书,你可能已经牢牢掌握iOS开发的基础,但这里有一些小特点和实践是许多开发者并不熟悉的,甚至有数年经验的开发者也是.在这一章里,你会学到一些很重要的开发技巧,但这仍远远不够,你还 ...

随机推荐

  1. Unity 视频播放杂谈

    http://www.cnblogs.com/zsb517/p/4060814.html 背景:      游戏机中想加入舞蹈元素,最先的想法是开发舞蹈游戏,然后通过动画来表现舞蹈,给用户提供舞蹈教学 ...

  2. Android学习笔记(十)——ListView的使用(上)

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! ListView绝对可以称得上是 Android中最常用的控件之一,ListView允许用户通过手指上下滑动的 ...

  3. cocos2d-x 内存管理浅析

    Cocos2d-x用create创建对象, 这个方法已经被引擎封装成一个宏定义了:CREATE_FUNC, 下面是这个宏定义的实现: #define CREATE_FUNC(__TYPE__) \   ...

  4. 在Fedora 20 上安装Mysql并初始化root密码

    [root@localhost ~]# yum -y install community-mysql-server #安装数据库 已加载插件:langpacks, refresh-packagekit ...

  5. eclipse中整合springMvc和velocity

    1.项目所需要的jar包(有些可能多余) 2.在src目录下创建一个bean  一个一个controller ,路径如下 person代码: package com.test.bean; import ...

  6. Android实用代码模块集锦

    1. 精确获取屏幕尺寸(例如:3.5.4.0.5.0寸屏幕) 1 2 3 4 5 6 public static double getScreenPhysicalSize(Activity ctx)  ...

  7. django的信号

    Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1.Django内置信号 Model signals pre_in ...

  8. Extjs 组件共用(单例)问题

    说明: 将store初始化在类定义时便创建, store实例将成为该类的单例 代码: 测试: 说明: 将store初始化放入initComponent函数中.  每次都将创建一个新的实例. 代码: 测 ...

  9. Git SourceTree 冲突解决方案

    Git现在越来越火,很多人都从Svn迁移到Git上面,Git让我们更加与世界接轨,不再是"局域网"的程序猿,特别是掌握了Git之后,会发现它真的很好用,本文对Git中比较烦人的冲突 ...

  10. POJ 1062 ( dijkstra )

    http://poj.org/problem?id=1062 一个中文题,一个多月之前我做过,当时我是用搜索写的,不过苦于卡在无法确定等级关系,所以就错了. 看了别人的博客后,我还是不是很理解所谓的枚 ...