三天前开始做一个安卓应用,想了解一下 Native Client 的开发方式,也借机快速学习一下 Java 。其中遇到的一些问题和想法,在这里记录一下。(我并没有深入学习过 Java 语言和安卓开发,因此以下内容都是按我个人的理解写成)

首先,我使用的是 Android Studio (I/O Preview) ,这个软件非常耗内存, studio64.exe 占用 600M 以上内存并不少见。这也是我对大部分 Java IDE 的一贯印象。但是这个软件尤其过分,它在启动的时候扫描工程文件,四个核心都能占用到 100% 。

ListView 就是最常见的列表视图。 ListView 要使用的话,要有一个适配器去给它提供数据。我使用了一个最简单的 ListView 和一个 ArrayAdapter 。在构造 ArrayAdapter 的时候,第一个参数是 Context ,按我的理解, Context 类型就是传递一个和这段代码运行环境相关的对象,就像 Context 经常被翻译成『上下文』一样,通过这个类型的对象可以获取一些资源,比如 View 或是 String 。这里的 Context 参数需要是当前 Activity 的 Context ,这就意味着,如果你在一个 Activity 之外的类中去生成这个适配器的话是办不到的。那怎么办呢,最简单的办法就是通过实现一个 setter 方法来把这个 Context 从 Activity 里传递到你自己的类里,或者直接修改类的构造函数,增加一个 Context 对象。在某些跟视图相关的类里,也可以通过调用视图的 getContext() 方法来获取,比如这样 getView().getRoorView().getContext() 。

NavigationDrawerFragment 貌似是上一次 Google I/O 大会的时候更新的新功能,是一个兼容旧 API 版本的导航抽屉。具体表现就是在应用界面上向右拉动,导航抽屉(就是一个简单的 ListView )会从左边过度进来,往左滑动或者按回退键可以再次隐藏到左边。差不多相当于易信的左导航效果,只不过这个抽屉是叠加在应用的主视图上面一层,而不是把主视图往右边推动。要使用的话,新建项目的时候可以选择带抽屉导航的项目,默认会生成三个导航项,代码也比较好懂,就不解释了。

多线程这个我理解得不是特别透彻,但我觉得网上有些教程真的是非常坑人,因为我个人觉得,只有线程间传递数据才有意义,要不然岂不是为了多线程而多线程?好吧,其实线程间传递数据就那么两个问题一个是 Handler ,一个是 Message 。

Message 就是用来传递消息的,这个类型的实例有两个属性,一个是 what ,一个是 obj 。我的理解是, what 用来存放消息的 case ,比如 msg.what = 0; 代表后台线程完成操作;而 obj 就可以用来传送线程操作的结果。因为多线程的实质就是把耗时的线程放到后台去执行,让 UI 线程可以正常响应事件而不会卡死,那么耗时的线程完成操作之后,就不仅要通知主线程它完成了操作,还要给出它的结果。比如我使用一个新线程去联网下载一段文本,因为主线程需要这段文本来填充一个列表,那么下载线程完成了操作后,必然要把下载的文本传递给主线程,这个时候就应该使用 msg.obj 属性来存放结果。

Handler 就是用来接收耗时线程发送的消息的。比如我定义 msg.what = 0; 为线程操作完成,那么在 Handler 的 handleMessage 方法中,就可以对 msg.what 进行 Switch/Case 分支判断,在 msg.what == 0 的时候从 msg.obj 中取出耗时线程的运行结果。

好吧,暂时也就这么多内容。另外有一个建议,遇到问题去搜索的时候,最好使用英文关键词搜索(推荐用全英文搜索),这样搜索出来的资料比较靠谱。还有,尽量用 Google 。