Android Programming: Pushing the Limits -- Chapter 2: Efficient Java Code for 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的更多相关文章
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- ApiWrapper
前面两片文章讲解了通过AIDL和Messenger两种方式实现Android IPC.而本文所讲的并不是第三种IPC方式,而是对前面两种方式进行封装,这样我们就不用直接把Aidl文件,java文件拷贝 ...
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger
Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...
- Android Programming: Pushing the Limits -- Chapter 5: Android User Interface Operations
多屏幕 自定义View 多屏幕 @.Android 4.2 开始支持多屏幕. @.举例: public class SecondDisplayDemo extends Activity { priva ...
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- AIDL
服务端: 最终项目结构: 这个项目中,我们将用到自定义类CustomData作为服务端与客户端传递的数据. Step 1:创建CustomData类 package com.ldb.android.e ...
- Android Programming: Pushing the Limits -- Chapter 4: Android User Experience and Interface Design
User Stories Android UI Design 附加资源 User Stories: @.通过写故事来设计应用. @.每个故事只关注一件事. @.不同的故事可能使用相同的组件,因此尽早地 ...
- Android Programming: Pushing the Limits -- Chapter 3: Components, Manifests, and Resources
Android Components Manifest文件 Resource and Assets v\:* {behavior:url(#default#VML);} o\:* {behavior: ...
- Android Programming: Pushing the Limits -- Chapter 1: Fine-Tuning Your Development Environment
ADB命令 Application Exerciser Monkey Gradle ProGuard 代码重用 版本控制 静态代码分析 代码重构 开发者模式 ADB命令: @.adb help:查 ...
- Android Programming: Pushing the Limits -- Chapter 6: Services and Background Tasks
什么时候使用Service 服务类型 开启服务 后台运行 服务通信 附加资源 什么时候使用Service: @.任何与用户界面无关的操作,可移到后台线程,然后由一个Service来控制这个线程. 服务 ...
- [iOS翻译]《iOS 7 Programming Pushing the Limits》系列:你可能不知道的Objective-C技巧
简介: 如果你阅读这本书,你可能已经牢牢掌握iOS开发的基础,但这里有一些小特点和实践是许多开发者并不熟悉的,甚至有数年经验的开发者也是.在这一章里,你会学到一些很重要的开发技巧,但这仍远远不够,你还 ...
随机推荐
- word20161130
1. even 偶数 [ǒu shù][词典] even; [数] even number;[例句]在本例中,slot A中有奇数个阵列,slot B中有偶数个阵列.In this example, ...
- Unity3D Pro破解
Win破解方法: 全新安装Unity且未打开Unity后!!! 下载程序, 右键管理员运行, 点击Browse选择Unity安装目录内的Editor文件夹, 确定. 然后点击大按钮PATCH即可, 如 ...
- 剑指Offer 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 入队:将元素进栈A 出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进 ...
- inner join ,left join ,right join 以及java时间转换
1.inner join ,left join 与 right join (from 百度知道) 例表aaid adate1 a12 a23 a3表bbid bdate1 ...
- python字符串函数
- Ubuntu+Apache+PHP+Mysql环境搭建
一.操作系统Ubuntu 14.04 64位,虚拟机服务器 二.Apache 1.安装Apache,安装命令:sudo apt-get install apache2 2.环境配置: 1)配置文件:路 ...
- java抓取快递100信息接口
package zeze; import java.io.IOException; import org.json.JSONArray; import org.json.JSONException; ...
- 新塘ARM平台交叉编译minigui界面库
简介 MiniGUI 是一款面向嵌入式系统的高级窗口系统(Windowing System)和图形用户界面(Graphical User Interface,GUI)支持系统,由魏永明先生于 1998 ...
- webrtc开源项目音频重采样“不友好接口”的几点总结
WebRTC(Web Real Time Communication)并不是Google原来自己的技术,在2010年,Google以大约6820万美元收购了VoIP软件 开发商Global IP So ...
- 傅里叶变换库FFTW的安装配置(VS2010)
FFTW是用来计算一维或者多维的离散傅里叶变换,输入可以为实数序列也可以为复数序列的C语言的子函数库,FFTW是免费软件,是作为fft函数库的各种应用的上佳选择. 1. 从网站http://www.f ...