第十章 货币实验:第2部分
重点关注MainActivity的功能并完成该App;使用ArrayAdapter把字符串数组绑定到选择列表;使用Android Srudio把视图行为的处理代理到包含他们的Activity;学习如何使用共同偏好以及资源;学习Android中的并发,尤其是如何使用AsynsTask;修改布局并使用Android Studio生成可绘制资源。
10.1定义MainActivity的成员
首先在MainActivity类中定义activity_main.xml布局文件中对应视图的引用,然后将对象赋值给它们。
*我们仅在MainActivity里面为activity_main.xml中那些之前已经分配了ID的视图定义引用。
*setContentView(R.layout.activity_main)语句会使用activity_main.xml中包含的视图进行填充。
*在Android中,单词inflate表示当Android遍历activity_main.xml布局中定义的视图时,它会将每个视图初始化为对上的Java对象。
*如果View对象有ID,那么Android将会把对象的内存位置与其ID关联起来。
*这种联系可以在自动生成的名为R.java的文件中找到,它是资源和Java源文件的桥梁。
在把布局及其所有视图填充到内存空间中以后,通过调用findViewById()方法并传入ID值可以把这些对象赋值给我们之前定义的引用。findViewById()方法返回一个View兑现个,它是Android中所有View和ViewGroup的祖先;而这也是我们需要将其返回值转换成适当View子类的原因。
10.2从bundle中解压出货币代码
10.3创建选项菜单
app:showAsAction属性决定了菜单项的位置。将此属性设置为never,表示此菜单项永远不会出现在操作栏上,而是总出现在溢出菜单中。(溢出菜单有操作栏右侧三个竖直的点来表示)
android:orderInCategory用于设置菜单项的次序。Android中的约定是使用100的倍数,例如可以用250在200和300之间插入一个新的菜单项。orderInCategory属性必须是整数,因此如果开始时使用诸如2和3这样的连续值,那么将会没有插入中间值的空间,而我们也不得不重新排序整个集合。
10.4实现选项菜单行为
要求用户授权并获得对设备网络状态的访问权限。
10.5创建spinner_closed布局
为处于关闭状态的选择列表创建布局
10.6将mCurrencies绑定到选择列表
我们需要将mCurrencies绑定到选择列表。uao实现此功能,我们将使用一个名为ArrayAdapter的类。
ArrayAdapter构造函数接受三个参数:上下文、布局和一个数组
10.7将选择列表行为代理给MainActivity
Java事件模型极其灵活。
我们可以将时间的处理代理到实现了相应监听器接口的任意对象。
如果视图是唯一的,那么将其行为处理代理到一个匿名内部类是有意义的。
然而如果布局中包含相同类型的多个视图,比如Currencies App中包含两个或更多个选择列表这种情况,那么将这些视图的处理代理到包含它们的类通常是更为简便的方法。
10.8创建偏好管理器
可以将共同偏好保存在用户设备上的文件中。这种文件是序列化的哈希表,保存着键/值对,而且每个App都可以拥有过自己的共同偏好。
共同偏好中可以保存的值类型被限定为Java基本数据类型、字符串、序列化对象和序列化对象数组。
与SQLite读写数据相比,共同偏好会慢一些。因此,不应该考虑将共同偏好用作记录管理,而应将SQLite数据库用作记录管理。即便如此,共同偏好仍是持久化保存用户偏好的一种好方法。
通过创建一个能够访问共同偏好的使用工具类。此实用工具类将含有公共的静态方法,允许我们获取和设置用户所选本国和外国货币的货币代码。
10.9根据给定代码查找位置
10.10从货币字符串中抽取代码
10.11实现共同偏好
共同偏好中的数据保存在哈希表中,其中键总是字符串,因此很适合将键定义为String常量。
10.12按钮单击行为
10.13保存开发者密钥
keys.properties
获取免费密钥 https://openexchangerates.org/signup/free
10.14获取开发者密钥
文件I/O是一个耗时的操作,定义一个getKey()方法包含这样的操作,需要尽可能少地调用getKey()方法。我们将在onCreate()中调用一次这个方法并在MainActivity的成员mKey中保存这个值,而非每次要获取汇率时都调用。
10.15 CurrencyConverterTask
Adroid并发的第一条规则是不要阻塞UI线程,也就是主线程。阻塞UI线程不仅会导致ANR错误,还会然供用户界面完全失去响应。
Android并发的第二条规则是UI线程是唯一一个拥有和用户界面交互权限的线程。当尝试从后台线程中更新任意视图,App将会崩溃。
AsyncTask类专门用于结局这些问题,因此它是Android并发的推荐事项方式。如果正确实现了AsyncTask,你便已经遵守了Android并发的这两条规则。
AsyncTask含有名为doInBackground()的抽象方法,所有具体类都需要重载它。此外可以重载其他的一些方法,包括onPreExecute()、onProgressUpdate()和onPostExecute()。
*AsyncTask的魔力在于doInBackground()方法在后台线程中只想,而其他方法均在UI线程中执行。只要在doInBackground()中不操作任何试图,就可以非常安全地使用AsyncTask
10.15.1onPreExecute()
onPreExecute()方法在UI线程中执行,它发上在启动doInBackground()方法之前。由于我们无法在后台线程中操作任何UI视图,因此onPreExecute()方法提供了在doInBackground()启动之前修改UI的机会。当onPreExecute()被调用时会显示ProgressDialog,它带有Cancel按钮,用户可以单击并终止操作。
10.15.2 doInBackground()
该方法是AsyncTask中excute()方法的代理。其参数被定义为可变参数,因此我们可以像execute()传入任意数量、类型为String的逗号分隔参数,可用params[0]来引用第一个元素。
10.15.3 onPostExecute()
doinBackground()的返回值被定义为JSONObject。相同的对象被作为参数传入onPostExecute()方法,当进入onPostExecute()方法时,doInBackground()方法的后台线程已经结束,现在可以使用从doInBackground()获取到的JSONObject数据安全地更新UI。最后做些计算并将格式化好的结果赋值给mConvertedTextView。
10.16按钮选择器
10.17启动图标
第11章 测试和分析
仪器测试;Monkey,是一款AndroidSDK自带的优秀工具,可以生成用于App压力测试的随机UI 事件;Android Studio中的一些分析工具。
11.1创建新的仪器测试
本节将学习通过继承android.test.ActivityInstrumentationTestCase2类来创建仪器测试。
11.1.1定义SetUp()和TearDown() (男默女泪?)
SetUp()方法让你能够连接所需的任意资源,通过bundle传入任意数据或者在运行测试之前复制引用。
TearDown()方法可以用于关闭所有链接以及在测试方法运行完之后清理所有资源。
在MainActivityTest中,将以几乎完全像同的方式获取MainActivity中视图的引用。我们需要一个对MainActivity的引用。ActivityInstrumentationTestCase2<MainActivity>类有一个名为getActivity()的方法,它返回一个对MainActivity的引用。当MainActivity引用被传入MainActivityTest的构造函数是,MainActivity中的视图已经填充完毕。一旦有了这个引用,就可以调用mActivity.findViewById()来获取视图的引用了
11.1.2在MainActivity中定义回调
11.1.3定义仪器测试方法 P255
11.1.4运行仪器测试
11.1.5修改bug
11.2使用Monkey
Monkey是Android SDK自带的一款ing为Monkey的优秀工具,也成为UI/应用测试器Monkey。这款工具能够针对App生成随机的UI事件,就像一只猴子在使用App一样,在做App压力测试时很有用
文档位于developer.android.com/tools/help/monkey.html
*另有一款MonkeyRunner的工具可以创建并运行Python脚本来进行自动化应用测试,与Monkey无关
eg:在运行后的终端输入以下命令:adb shell monkey -p com.apress.gerber.currencies -v 2000
允许与正在运行设备的额操作系统shell交互
-p开关告诉Monkey将随机UI时间限定在com.apress.gerber.currencies包中
-v开关告诉Monkey尽可能详细的汇报事件和异常
2000是事件的数量
*运行Monkey时,虽然已经将Monkey的UI事件限定为特定包,但你还是会面临设备默认设置被修改的风险。例如Monkey关闭了Wi-Fi或者修改了默认语言也并不罕见
11.3使用分析工具
与Android Studio捆绑的分析工具成为Lint。
Lint会分析你的源代码、XML文件以及其他资源,查找潜在的bug、未使用的资源、抵消布局、硬编码文本和其他Android相关的潜在问题。可以通过位于主菜单栏中的Analyze菜单来访问Android Studio的分析工具
11.3.1检查代码
Analyze|Inspect Code
*应该只把Lint和其他分析工具识别出的问题视作建议,不要试图修改识别出的每一个问题,如果做了修改要确保没有引入新的错误。
11.3.2分析依赖 Analyze|Analyze Dependencies
分析以来操作将会检查源代码并自动识别所有的依赖。
随着Gradle的使用,大多数以来都可以自动下载,Gradle让管理以来变得更加简单便捷。
11.3.3分析栈轨迹
logcat窗口中的内容非常详细,以至于很容易让人眼花缭乱,这就是要使用分析栈轨迹操作的原因。
Analyze|Analyze Stacktrace
第12章 调试
将详细探讨调试器并再次探索其他一些分析工具,他们不仅可以用于修改错误,还可以深入观察工作中的潜在隐患
12.1日志
日志是一种将变量值或程序状态大一到系统控制台的放啊,是的可以在程序运行过程中阅读这些信息。
Android平台上负责日志消息的框架成为logger。它获取来自各种事件(并不限于你的应用)的输出并将这些输出保存在一系列循环缓冲区中。
循环缓冲区是一种列表类的数据结构,类似于链表,但除了以串行方式连接其元素之外,它还将首尾的元素相互连接。
这些缓冲区包括radio——包含音频和电话相关的消息:event——包含系统时间消息,例如服务创建和销毁的通知;以及main——包含主日志输出。
12.1.1使用logcat
可以在命令行中使用logcat,它与绑定设备相互连接并将这些循环缓存区中的内容中转到开发控制台
使用语法 P266 过滤器控件
12.1.2写入Android日志
12.2捕捉Bug!
12.2.1使用交互式调试器
**************************************************看书吧!
第13章 Gradle
本章将探讨Gradle并结合示例讲解如何将其用于开发和维护Android App
构建系统:构建系统通过提供完成这些任务的必要工具来满足用户的迫切需求。试想大量开发者如今面临的迫切需要:支持最终产品的变体(调试版、发布版、付费版和免费版)、管理项目中包含的第三方软件库和组件,以及基于外部参数向整体过程添加条件。
Gradle构建使用Groovy程序语言编写,构建在Java核心运行时和API之上。Groovy大体采用Java的语法,同时融入了自己的语法,所以只需要做极少的修改就可以将大多数Java代码迁移到Groovy。可以高效地在Gradle构建脚本中加入Java语法,以便实现想要的效果。Groovy还将闭包加入Java语法中。闭包是一个由花括号包围的代码块,可以将其赋值给变量或者传递给方法。闭包是Gradle构建系统的核心部分。
13.1 Gradle语法
*************************************************看书吧!
第十四章 更多SDK工具
14.1 设备监视器 Android Device Monitor
14.1.1线程监视器 Update Threads
14.1.2堆监视器 Update Heap
14.1.3分配跟踪器 Allocation Tracker
14.1.4网络统计 Network Statistics
14.1.5层次查看器 Hierarchy View
14.2Android监视器
Device Logcat
14.2.1内存监视器
Memory Monitor
14.2.2方法跟踪工具 Method Trace
14.2.3分配跟踪器
14.2.4屏幕抓取 Screen Capture Screen Record
14.3导航编辑器 Navigation Editor
这个编辑器允许你快速射击App的高层工作流原型,同时在编辑模式中导航特定的Activiry和Fragment,如果有了App的大体思路并且想要预览用户在不同界面中的切换情况,它将是一个理想的工具
14.4终端
14.4.1查询设备
adb device
14.4.2安装APK
adb install /path/to/app.apk
14.4.3下载文件
adb pull
14.4.4上传文件
adb push
14.4.5端口转发
adb forward local-port remote-port
14.5Google云工具 (墙)
第十五章 Android可穿戴设备实验
第十六章 定制Android Studio