Android开发一些重要知识点_第1页
Android开发一些重要知识点_第2页
Android开发一些重要知识点_第3页
Android开发一些重要知识点_第4页
Android开发一些重要知识点_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android 开发网上的一些重要知识点开发网上的一些重要知识点 1 android 单实例运行方法 我们都知道 Android 平台没有任务管理器 而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁 对于常规从快捷方式运行来看都是 startActivity 可能会使用 FLAG ACTIVITY NEW TASK 标记来打开一个新窗口 比如 Launcher 所以考虑单任务 的实现方法比较简单 首先 Android123 纠正下大家一种错误的方法就是直接在 androidmanifest xml 的 application 节点中加入 android launchMode singleInstance 这句 其实这样将不会起到任何作用 Apps 内部维护的历史栈作用于 Activity 我们必须在 activity 节点中加入 android launchMode singleInstance 这句才能保证单实例 当然一 般均加在主程序启动窗口的 Activity 2 px 像素如何转为 dip 设备独立像素 最近有网友问如何将 px 像素转为 dip 独立设备像素 由于 Android 的设备分辨率众多 目 前主流的为 wvga 而很多老的设备为 hvga 甚至低端的 qvga 对于兼容性来说使用 dip 无 非是比较方便的 由于他和分辨率无关和屏幕的密度大小有关 所以推荐使用 px int dip density 0 5f 这里 android 开发网提示大家很多网友获取 density 密度 的方法存在 问题 从资源中获取的是静态定义的 一般为 1 0 对于 HVGA 是正好的 而对于 wvga 这 样的应该从 WindowsManager 中获取 WVGA 为 1 5 这里可以再补充一下 dip sip 的知 识 3 Android 中动态改变 ImageView 大小 很多网友可能发现在 layout xml 文件中定义了 ImageView 的绝对大小后 无法动态修改以 后的大小显示 其实 Android 平台在设计 UI 控件时考虑到这个问题 为了适应不同的 Drawable 可以通过在 xml 的相关 ImageView 中加入 android scaleType fitXY 这行即可 但因为使用了缩放可能会造成当前 UI 有所变形 使用的前提是限制 ImageView 所在的层 可以使用一个内嵌的方法限制显示 4 如何判断 Android 手机当前是否联网 如果拟开发一个网络应用的程序 首先考虑是否接入网络 在 Android 手机中判断是否联 网可以通过 ConnectivityManager 类的 isAvailable 方法判断 首先获取网络通讯类的实 例 ConnectivityManager cwjManager ConnectivityManager getSystemService Context CONNECTIVITY SERVICE 使用 cwjManager getActiveNetworkInfo isAvailable 来返回是否有效 如果为 True 则表示 当前 Android 手机已经联网 可能是 WiFi 或 GPRS HSDPA 等等 具体的可以通过 ConnectivityManager 类的 getActiveNetworkInfo 方法判断详细的接入方式 需要注意 的是有关调用需要加入 这个权限 android 开发网提醒大家在真机上 Market 和 Browser 程序都使用了这个方法 来判断是否继续 同时在一些网络超时的时候也可以检查下网络连接是否存在 以免浪费 手机上的电力资源 5 Drawable Bitmap Canvas 和 Paint 的关系 很多网友刚刚开始学习 Android 平台 对于 Drawable Bitmap Canvas 和 Paint 它们之 间的概念不是很清楚 其实它们除了 Drawable 外早在 Sun 的 J2ME 中就已经出现了 但 是在 Android 平台中 Bitmap Canvas 相关的都有所变化 首先让我们理解下 Android 平台中的显示类是 View 但是还提供了底层图形类 android graphics 今天所说的这些均 为 graphics 底层图形接口 Bitmap 称作位图 一般位图的文件格式后缀为 bmp 当然 编码器也有很多如 RGB565 RGB888 作为一种逐像素的显示对象执行效率高 但是缺 点也很明显存储效率低 我们理解为一种存储对象比较好 Drawable 作为 Android 平 下通用的图形对象 它可以装载常用格式的图像 比如 GIF PNG JPG 当然也支持 BMP 当然还提供一些高级的可视化对象 比如渐变 图形等 Canvas 名为画布 我 们可以看作是一种处理过程 使用各种方法来管理 Bitmap GL 或者 Path 路径 同时它可 以配合 Matrix 矩阵类给图像做旋转 缩放等操作 同时 Canvas 类还提供了裁剪 选取等 操作 Paint 我们可以把它看做一个画图工具 比如画笔 画刷 他管理了每个画图工 具的字体 颜色 样式 如果涉及一些 Android 游戏开发 显示特效可以通过这些底层 图形类来高效实现自己的应用 6 Activity 切换导致的 onCreate 重复执行 部分网友会发现 Activity 在切换到后台或布局从横屏 LANDSCAPE 切换到 PORTRAIT 会 重新切换 Activity 会触发一次 onCreate 方法 我们可以在 androidmanifest xml 中的 activit 元素加入这个属性 android configChanges orientation keyboardHidden 即可 比如 同时在 Activity 的 Java 文件中重载 onConfigurationChanged Configuration newConfig 这个方法 这样就不会在布局切换或 窗口切换时重载 onCreate 等方法 代码如下 java view plaincopyprint 1 Override 2 public void onConfigurationChanged Configuration newConfig 3 4 super onConfigurationChanged newConfig 5 if this getResources getConfiguration orientation Configuration ORIEN TATION LANDSCAPE 6 7 land 8 9 else if this getResources getConfiguration orientation Configuration O RIENTATION PORTRAIT 10 11 port 12 13 7 Android 的 ImageButton 问题 很多网友对 Android 提供的 ImageButton 有个疑问 当显示 Drawable 图片时就不会再显 示文字了 其实解决的方法有两种 第一种就是图片中就写入文字 但是这样解决会增加 程序体积 同时硬编码方式会影响多国语言的发布 第二种解决方法很简单 通过分析可 以看到 ImageButton 的 layout 我们可以直接直接继承 添加一个 TextView 对齐方式为 右侧即可实现 ImageButton 支持文字右侧显示 8 Android 代码优化技术 1 Java 内存控制 对于字符串操作而言如果需要连加这样的操作建议使用 StringBuilder 经过调试不难发现如果你的字符串每次连加 使用 String 需要的内存开销会远大于 StringBuilder 然后 Android 手机常规的运行内存大约在 128MB 左右 对于运行多任务就 需要考虑了 Android 开发网提示因为 Java 有 GC 不需要手动释放那么分配的时候就要格 外的小心 频繁的 GC 操作仍然是很影响性能的 在调试时我们可以通过 logcat 查看内存 释放情况 2 循环使用 平时在访问一个属性的时候效率远比一个固定变量低 如果你的 循环估计次数常常大于 5 假设 xxx GetLength 方法的值一般大于 5 推荐这样写 比如 for int i 0 i xxx GetLength i 这里 xxx GetLength 在每次循环都要调用 必然会影响 程序效率 在游戏开发中显得更为明显 改进的方法应该为 int j xxx GetLength for int i 0 i j i 3 图片的优化 在 Android 平台中 2 维图像处理库 BitmapFactory 做的 比较智能 为了减少文件体积和效率 常常不用很多资源文件 而把很多小图片放在一个 图片中 有切片的方式来完成 在 J2ME 中我们这样是为了将少文件头而解决 MIDP 这些 设备的问题 而 Android 中虽然机型硬件配置都比较高 有关 Android G1 硬件配置可以参 考 G1 手机参数以及评测 但是当资源多时这样的运行效率还是令人满意的 至少 Dalvik 优化的还不是很够 9 Android 开发进阶之 NIO 非阻塞包 一 对于 Android 的网络通讯性能的提高 我们可以使用 Java 上高性能的 NIO New I O 技 术进行处理 NIO 是从 JDK 1 4 开始引入的 NIO 的 N 我们可以理解为 Noblocking 即非 阻塞的意思 相对应传统的 I O 比如 Socket 的 accpet read 这些方法而言都是阻塞 的 NIO 主要使用了 Channel 和 Selector 来实现 Java 的 Selector 类似 Winsock 的 Select 模式 是一种基于事件驱动的 整个处理方法使用了轮训的状态机 如果你过去开 发过 Symbian 应用的话这种方式有点像活动对象 好处就是单线程更节省系统开销 NIO 的好处可以很好的处理并发 对于 Android 网游开发来说比较关键 对于多点 Socket 连接 而言使用 NIO 可以大大减少线程使用 降低了线程死锁的概率 毕竟手机游戏有 UI 线程 音乐线程 网络线程 管理的难度可想而知 同时 I O 这种低速设备将影响游戏的体验 NIO 作为一种中高负载的 I O 模型 相对于传统的 BIO Blocking I O 来说有了很大的提高 处理并发不用太多的线程 省去了创建销毁的时间 如果线程过多调度是问题 同时很多 线程可能处于空闲状态 大大浪费了 CPU 时间 同时过多的线程可能是性能大幅下降 一般的解决方案中可能使用线程池来管理调度但这种方法治标不治本 使用 NIO 可以使并 发的效率大大提高 当然 NIO 和 JDK 7 中的 AIO 还存在一些区别 AIO 作为一种更新的 当然这是对于 Java 而言 如果你开发过 Winsock 服务器 那么 IOCP 这样的 I O 完成端 口可以解决更高级的负载 当然了今天 Android123 主要给大家讲解下为什么使用 NIO 在 Android 中有哪些用处 NIO 我们分为几个类型分别描述 作为 Java 的特性之一 我们 需要了解一些新的概念 比如 ByteBuffer 类 Channel SocketChannel ServerSocketChannel Selector 和 SelectionKey 有关具体 的使用 Android 开发网将在明天详细讲解 网友可以在 Android SDK 文档中看下 java nio 和 java nio channels 两个包了解 了解下这种技术 看看在马上要做的项目中是否用得到 10 Android Theme 和 Styles 内部定义解析 昨天我们讲到的有关在 AndroidManifest xml 中定义 Activity 的 theme 方法来实现无标题的 方法 在使用 xml 让你的 Activity 无标题方法 一文中讲到的 很多网友不明白为什么这样 做 其实在 Android123 以前的文章中多次提到了 styles 样式定义方法 今天 Android 开 发网再次把一些网友回顾了解下 android 样式的内部定义 在一个工程的 res values theme xml 中我们可以方便的定义自己的风格主题 比如下面的 cwjTheme 中 我们使用了基于 android 内部的白色调的背景 Theme Light 设置 windowsNoTitle 为 true 代表没有标题 背景颜色我们使用了 android 内部定义的透明 同时设置 listView 控件的 样式为 cwjListView xml 样式代码如下 html view plaincopyprint 1 2 3 4 true 5 android color transpar ent 6 style cwjListView 7 有关 ListView 控件我们自定义的风格就是修改下系统 listview 这个控件的每行分隔符样式 这里我们在工程下 res drawable 文件夹下 放一个图片名为 list selector 图片 这样我们的 cwjListView 的代码可 以这样写 8 drawable list selector 9 10 通过定义 style 可以设置更多 比如让 cwjListView 的字 体颜色就加入 textAppearance 属性 比如 android style TextAppearance 11 Android JSON 解析示例代码 来自 Google 官方的有关 Android 平台的 JSON 解析示例 如果远程服务器使用了 json 而 不是 xml 的数据提供 在 Android 平台上已经内置的 org json 包可以很方便的实现手机客 户端的解析处理 下面 Android123 一起分析下这个例子 帮助 Android 开发者需要有关 HTTP 通讯 正则表达式 JSON 解析 appWidget 开发的一些知识 java view plaincopyprint 1 public class WordWidget extends AppWidgetProvider appWidget 2 Override 3 public void onUpdate Context context AppWidgetManager appWidg etManager 4 int appWidgetIds 5 context startService new Intent context UpdateService class 避免 ANR 所以 Widget 中开了个服务 6 public static class UpdateService extends Service 7 Override 8 public void onStart Intent intent int startId 9 Build the widget update for today 10 RemoteViews updateViews buildUpdate this Compo nentName thisWidget new ComponentName this WordWidget class 11 AppWidgetManager manager AppWidgetManager getInstanc e this 12 manager updateAppWidget thisWidget updateViews 13 public RemoteViews buildUpdate Context context 14 Pick out month names from resources 15 Resources res context getResources 16 String monthNames res getStringArray R array month nam es Time today new Time 17 today setToNow String pageName res getString R s tring template wotd title 18 monthNames today month today monthDay 19 RemoteViews updateViews null 20 String pageContent try 21 SimpleWikiHelper prepareUserAgent context 22 pageContent SimpleWikiHelper getPageContent pageNam e false 23 catch ApiException e 24 Log e WordWidget Couldn t contact API e 25 catch ParseException e 26 Log e WordWidget Couldn t parse API response e 27 Pattern pattern Ppile SimpleWikiHelper W ORD OF DAY REGEX 正则表达式处理 有关定义见下面的 SimpleWikiHelper 类 28 Matcher matcher pattern matcher pageContent 29 if matcher find 30 updateViews new RemoteViews context getPackageName R layout widget word String wordTitle matcher group 1 31 updateViews setTextViewText R id word title wordTitle 32 updateViews setTextViewText R id word type matcher grou p 2 33 updateViews setTextViewText R id definition matcher group 3 trim String definePage res getString R string templat e define url 34 Uri encode wordTitle 35 Intent defineIntent new Intent Intent ACTION VIEW Uri pa rse definePage 这里是打开相应的网页 所以 Uri 是 http 的 url action 是 view 即打开 web 浏览器 36 PendingIntent pendingIntent PendingIntent getActivity cont ext 37 0 no requestCode defineIntent 0 no flags 38 updateViews setOnClickPendingIntent R id widget pendingI ntent 单击 Widget 打开 Activity else 39 updateViews new RemoteViews context getPackageName R layout widget message 40 CharSequence errorMessage context getText R string wid get error 41 updateViews setTextViewText R id message errorMessage 42 43 return updateViews 44 Override 45 public IBinder onBind Intent intent 46 We don t need to bind to this service 47 return null 48 49 50 有关网络通讯的实体类 以及一些常量定义如下 public class SimpleWikiHelper 51 private static final String TAG SimpleWikiHelper public static fi nal String WORD OF DAY REGEX 52 s wotd private static fin al String WIKTIONARY PAGE 53 http en wiktionary org w api php action query private static final String WIKTIONARY EXPAND TEMPLATES 55 private static final int HTTP ST ATUS OK 200 private static byte sBuffer new byte 512 pri vate static String sUserAgent null public static class ApiExceptio n extends Exception 56 public ApiException String detailMessage Throwable throwable 57 super detailMessage throwable 58 public ApiException String detailMessage 59 super detailMessage 60 61 public static class ParseException extends Exception 62 public ParseException String detailMessage Throwable throwabl e 63 super detailMessage throwable 64 65 public static void prepareUserAgent Context context 66 try 67 Read package name and version number from manifest 68 PackageManager manager context getPackageManager 69 PackageInfo info manager getPackageInfo context getPacka geName 0 70 sUserAgent String format context getString R string template user agent 71 info packageName info versionName catch Name NotFoundException e 72 Log e TAG Couldn t find package information in PackageMan ager e 73 74 public static String getPageContent String title boolean expandT emplates 75 throws ApiException ParseException 76 String encodedTitle Uri encode title 77 String expandClause expandTemplates WIKTIONARY EXPA ND TEMPLATES String content getUrlContent String form at WIKTIONARY PAGE encodedTitle expandClause 78 try 79 JSONObject response new JSONObject content 80 JSONObject query response getJSONObject query 81 JSONObject pages query getJSONObject pages 82 JSONObject page pages getJSONObject String pages keys next 83 JSONArray revisions page getJSONArray revisions 84 JSONObject revision revisions getJSONObject 0 85 return revision getString 86 catch JSONException e 87 throw new ParseException Problem parsing API response e 88 89 protected static synchronized String getUrlContent String url thr ows ApiException 90 if sUserAgent null 91 throw new ApiException User Agent string must be prepared 92 HttpClient client new DefaultHttpClient 93 HttpGet request new HttpGet url 94 request setHeader User Agent sUserAgent 设置客户端标识 try 95 HttpResponse response client execute request Statu sLine status response getStatusLine 96 if status getStatusCode HTTP STATUS OK 97 throw new ApiException Invalid response from server 98 status toString 99 HttpEntity entity response getEntity 100 InputStream inputStream entity getContent 获取 HTTP 返回的数据流 ByteArrayOutputStream content new ByteArrayOutputStrea m int readBytes 0 101 while readBytes inputStream read sBuffer 1 102 content write sBuffer 0 readBytes 转化为字节数组流 103 return new String content toByteArray 从字节 数组构建 String 104 catch IOException e 105 throw new ApiException Problem communicating with API e 106 107 108 关整个每日维基的 widget 例子比较简单 主要是帮助大家积累常用代码 了解 Android 平 台 JSON 的处理方式 毕竟很多 Server 还是 Java 的 12 Android 中使用定时器 TimerTask 类介绍 在 Android 平台中需要反复按周期执行方法可以使用 Java 上自带的 TimerTask 类 TimerTask 相对于 Thread 来说对于资源消耗的更低 除了使用 Android 自带的 AlarmManager 使用 Timer 定时器是一种更好的解决方法 我们需要引入 import java util Timer 和 import java util TimerTask java view plaincopyprint 1 private Timer mTimer new Timer tru e 2 private TimerTask mTimerTask mTimerTask new TimerTask 3 4 public void run 5 6 Log v android123 cwj 7 8 9 10 11 12 mTimer schedule mTimerTask 5000 1000 在 1 秒后每 5 秒执行一次定时器中的方法 比如本文为调用 log v 打印输出 如果想取消可以调用下面方法 取消定时器的执行 while mTimerTask cancel 13 mTimer cancel 最后 Android123 提示大家 如果处理的东西比 较耗时还是开个线程比较好 Timer 还是会阻塞主线程的执行 更像是 一种消息的执行方式 当然比 Handler 的 postDelay 等方法更适合处理 计划任务 14 15 16 13 Android 应用 Icon 大小在不同分辨率下定义 17 对于 Android 平台来说 不同分辨率下 Icon 的大小设 计有着不同的要求 对于目前主流的 HDPI 即 WVGA 级别来说 通常 hdpi 的应用 icon 大小为 72x72 而标准的 mdpi 即 hvga 为 48x48 对 于目前 HTC 和 Motorola 推出的一些 QVGA 的使用了 ldpi 图标为 32x32 常见的 Android 图标大小设计规范如下表所示 18 Launcher 19 36 x 36 px 20 48 x 48 px 21 72 x 72 px Menu 22 36 x 36 px 23 48 x 48 px 24 72 x 72 px Status Bar 25 24 x 24 px 26 32 x 32 px 27 48 x 48 px Tab 28 24 x 24 px 29 32 x 32 px 30 48 x 48 px Dialog 31 24 x 24 px 32 32 x 32 px 33 48 x 48 px List View 34 24 x 24 px 35 32 x 32 px 36 48 x 48 px 对于 android 界面设计的安全色 如下表 而对于系统自带默认程序的图标 下面为 png 的透明格式 直接鼠标右键另存为即可 37 38 39 看看 sdk 文档上的关于界面图标的详细说明 14 Android 控件美化 Shape 你会用吗 40 如果你对 Android 系统自带的 UI 控件感觉不够满意 可以尝试下自定义控件 我们就以 Button 为例 很早以前 Android123 就写到过 Android Button 按钮控件美 化方法里面提到了 xml 的 selector 构造 当然除了使用 drawable 这样的图片外今天 Android 开发网谈下自定义图形 shape 的 方法 对于 Button 控件 Android 上支持以下几种属性 shape gradient stroke corners 等 41 我们就以目前系统的 Button 的 selector 为例说下 42 43 47 50 52 57 58 59 对于上面 这条 shape 的定义 分别为渐变 在 gradient 中 startColor 属性为开始的颜色 endColor 为渐变结束的颜色 下面的 angle 是角度 接下来是 stroke 可以理解为边缘 corners 为拐角这里 radius 属性为半 径 最后是相对位置属性 padding 对于一个 Button 完整的定义可以 为 60 61 63 64 65 69 72 74 79 80 81 82 86 89 91 96 97 98 99 103 106 108 113 114 115 116 117 注意 Android123 提示大家 以上几个 item 的区别主要是体现在 state pressed 按下或 state focused 获得焦点时 当当来判断显示什么 类型 而没有 state xxx 属性的 item 可以看作是常规状态下 118 15 Android 开发者应该保持以下特质 119 Android123 推荐新手应该遵循 1 深读 SDK 文 档 2 深读 SDK 的 APIDemo 和 Samples 3 掌握 GIT 开源代码 4 多了解 Android 开源项目 学习别人的手法写程序 120 121 16 Android 数组排序常见方法 122 Android 的数组排序方式基本上使用了 Sun 原 生的 Java API 实现 常用的有 Comparator 接口实现 compare 方法和 Comparable 接口的 compareTo 方法 我们对于一个数组列表比如 ArrayList 可以通过这两个接口进行排序和比较 这里 Android123 给大 家一个例子 123 124 private final Comparator cwjComp arator new Comparator private final Collator collator Colla tor getInstance 125 public final int compare Object a Object b 126 CharSequence a Item a sName 127 CharSequence b Item b sID 128 return pare a b 129 130 131 132 我们的 ArrayList 对象名为 mList 则执行排序可以调用方法 Collections sort mList cwjComparator 133 17 Android 控件 TextProgressBar 进度条上显文字 134 Android 系统的进度条控件默认的设计的不是很 周全 比如没有包含文字的显示 那么如何在 Android 进度条控件上显 示文字呢 来自 Google 内部的代码来了解下 主要使用的 addView 这 样的方法通过覆盖一层 Chronometer 秒表控件来实现 整个代码如下 135 public class TextProgressBar ext ends RelativeLayout implements OnChronometerTickListener 136 public static final String TAG TextProgressBar 137 static final int CHRONOMETER ID android R id text1 138 static final int PROGRESSBAR ID android R id progress 139 Chronometer mChronometer null 140 ProgressBar mProgressBar null 141 long mDurationBase 1 142 int mDuration 1 boolean mChronometerFollow false 143 int mChronometerGravity Gravity NO GRAVITY 144 public TextProgressBar Context context AttributeSet attrs int d efStyle 145 super context attrs defStyle 146 public TextProgressBar Context context AttributeSet attrs 147 super context attrs 148 public TextProgressBar Context context 149 super context 150 Android 开发网提示关键部分在这里 Override 151 public void addView View child int index ViewGroup LayoutPar ams params 152 super addView child index params 153 int childId child getId 154 if childId CHRONOMETER ID 156 mChronometer setOnChronometerTickListener this 157 Check if Chronometer should move with with ProgressBa r 158 mChronometerFollow params width ViewGroup Layo utParams WRAP CONTENT 159 mChronometerGravity mChronometer getGravity 160 else if childId PROGRESSBAR ID 162 163 android view RemotableViewMethod 164 public void setDurationBase long durationBase 165 mDurationBase durationBase 166 if mProgressBar null mChronometer null 167 throw new RuntimeException Expecting child ProgressBar with id 168 android R id progress and Chronometer id android R id text1 169 170 Update the ProgressBar maximum relative to Chronometer base 171 mDuration int durationBase mChronometer getBase 172 if mDuration mDurationBase 185 mChronometer stop 186 int remaining int mDurationBase now 187 mProgressBar setProgress mDuration remaining 188 if mChronometerFollow 189 RelativeLayout LayoutParams params 190 params RelativeLayout LayoutParams mProgressBar g etLayoutParams 191 int contentWidth mProgressBar getWidth params leftMargin params rightMargin 192 int leadingEdge contentWidth mProgressBar getProgr ess 193 mProgressBar getMax params leftMargin 194 int adjustLeft 0 195 int textWidth mChronometer getWidth 196 if mChronometerGravity Gravity RIGHT 197 adjustLeft textWidth 198 else if mChronometerGravity Gravity CENTER HORI ZONTAL 199 adjustLeft textWidth 2 200 201 leadingEdge adjustLeft 202 int rightLimit contentWidth params rightMargin textWidth 203 if leadingEdge rightLimit 206 leadingEdge rightLimit 207 208 params RelativeLayout LayoutParams mChronometer getLayoutParams 209 params leftMargin leadingEdge 210 mChronometer requestLayout 211 212 213 214 215 18 Android 内存管理 SoftReference 的使用 216 217 很多时候我们需要考虑 Android 平台上的内存管 理问题 Dalvik VM 给每个进程都分配了一定量的可用堆内存 当我们 处理一些耗费资源的操作时可能会产生 OOM 错误 OutOfMemoryError 这样的异常 Android123 观察了下国内的类似 Market 客户端设计 基 本上都没有采用很好的内存管理机制和缓存处理 如果细心的网友可 能发现 Android Market 客户端载入时 每个列表项的图标是异步刷新 显示的 但当我们快速的往下滚动到一定数量比如 50 个 再往回滚动 时可能我们看到了部分 App 的图标又重新开始加载 当然这一过程可 能是从 SQLite 数据库中缓存的 但是在内存中已经通过类似 SoftReference 的方式管理内存 218 在 Java 中内存管理 引用分为四大类 强引用 HardReference 弱引用 WeakReference 软引用 SoftReference 和虚引用 PhantomReference 它们的区别也很明显 HardReference 对象是即 使虚拟机内存吃紧抛出 OOM 也不会导致这一引用的对象被回收 而 WeakReference 等更适合于一些数量不多 但体积稍微庞大的对象 在这四个引用中 它是最容易被垃圾回收的 而我们对于显示类似 Android Market 中每个应用的 App Icon 时可以考虑使用 SoftReference 来解决内存不至于快速回收 同时当内存短缺面临 Java 219 VM 崩溃抛出 OOM 前时 软引用将会强制回收内存 最后的虚引 用一般没有实际意义 仅仅观察 GC 的活动状态 对于测试比较实用同 时必须和 ReferenceQueue 一起使用 对于一组数据 我们可以通过 HashMap 的方式来添加一组 SoftReference 对象来临时保留一些数据 同时对于需要反复通过网络获取的不经常改变的内容 可以通过本地的 文件系统或数据库来存储缓存 希望给国内做 App Store 这样的客户端 一些改进建议 220 221 19 反射在 Android 开发中的利弊 222 由于 Android 2 2 的推出 很多新的 API 加入导 致很多项目移植需要考虑使用 Java 的反射机制 Reflection 来动态调用 动态

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论