论坛首页 移动开发技术论坛

[书评]深入潜出Google Android

浏览 12456 次
精华帖 (5) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-10-03  
首先感谢图灵教育的刘江大人赠书 http://www.turingboo.com

270多页, 还行, 阅读量不算很大, 封面设计不错, 每个章节都有一句诗词相配, 很有意思.
对于初学者来说, 这本书还是值得一看的, 特别是英文不够好的朋友, 起码有点中文的资料可以参考.
当然, 书中一些内容可能过于简化, 对初学者来说, 有些地方解释的不够清楚.  所以定位这本书的目标开发者群就有点尴尬, 初学者需要更多的解释和示范; 已经起步的同学需要更深奥的东西, 但内容又相对不是很深入.
不过总的来说看完全书后, 一个新手应该对Android的系统有一定的了解了, 然后可以参考文档和SDK里面的ApiDemos来进一步学习.

好了, 现在开始拍砖.  不拍就不会有进步了.

第一,二章
介绍Android和SDK配置...

第三章
主要介绍了Android的几个主要部分和Activity的生命周期.
个人觉得如果看过Android文档关于这部分的内容的话, 这章可以粗粗得看一下, 基本上差不多的内容.

第四章
用户界面的基本介绍, 介绍了一些常见的界面控制器和用法.

第五章
这章写得还不错, 就是Intent这些介绍还是略显短了点.  Intent是android SDK的一个很重要的部分, 值得多写一些相关内容.

第六章
中规中矩, 不过如果可以介绍下Remote Service和AIDL会更好.

第七章

第152页
UrlEncodedFormEntity [color=red]p_entity[/color] = new ...

这位同学连java的命名规范都弄错了...

第174页, catch exception里面是e.printStackTrace().
这个... 打印给谁看啊?  正确的作法是用Android的Log来记录:
Log.e(TAG, e.getMessage(), e);



第八章
第182页和185页
在updateWithNewLocation(Location location)的方法中:
TextView myLocationText;
myLocationText = (TextView)findViewById(R.id.myLocationText);


这段获取TextView的代码应该在onCreate()里面才合适.  不然每次这个方法被调用, 都要重新new出一个TextView, 内存上的大忌.

第189页
protected boolean isRouteDisplayed() {
return false;
}

原文是"它表示是否需要在地图上绘制导航线路".
意义上确实如此, 但这个方法目前只能返回false, 因为目前android被明令禁止提供实时路况信息.
如果return true的话, app是通不过审查的.  所以不是"是否"的问题, 而是必须是要返回false.

第192页
最下面那段, 需要用MapView对象调用getControl()方法来获得一个MapControl.
这里应该是getController(), 获得一个MapController.

第194页
在map的缩放代码那里
inBtn = ...
outBtn = ...
OnClickListener listener = new ... {
switch (v.getId()) {
case R.id.in:
ctrlMap.controlIn();
break;
case R.id.out:
ctrlMap.controlOut();
break;
...
}
inBtn.setOnClickListener(listener);
outBtn.setOnClickListener(listener);

代码没错.  但既然zoom in和out都有对应的button了, 何必搞一个listener, 然后每次在onClick里面判断到底是哪个button被按了呢?  分开两个listener就可以了.  多了一个listener的实例, 但代码更精炼, 逻辑更直接.  运行的时候少了一大批stack里面的method pop (v.getId()).  (貌似前面几章也有类似的问题).

第九章

我个人觉得SharedPreferences应该放在前面, 接下来是File IO, 最后是Sqlite/Content Provider.
一般章节安排都是由浅入深, 读者的接受上比较自然.

第223页
上面的"getTyper()"印错了, 应该是getType().

第十章
由于本人还没怎么正式接触开发widget和live folder, 所以这章内容对我来说还是挺好玩的

第十一章
虚拟键盘的部分最近也接触了一些, 比较繁琐.  如果不是自己开发输入法的话, 还是不要碰为好.

第十二章
第278到279页.  关于程序升级的事情.  以前Market没有提供自动升级的时候, 是要在自己的app里面检测版本号, 然后和自己服务器端的版本号比较, 如果需要升级的, 给用户一个提示.  文中并没有写一个如何获取版本号的代码.  其实这个从PackageManager拿版本号的代码很简单:
PackageInfo pi = this.getApplication().getPackageManager().getPackageInfo(this.getApplication().getPackageName(), 0);
            int currentVersion = pi.versionCode;
            
            int latestVersion = // 从web server拿最新版本号, 简单的HTTP GET
            
            if (latestVersion > currentVersion) {

            }



第十三章

先声明, 一下所做的评论有马后炮,事后诸葛亮的嫌隙, 现担待下.
这篇首先就写了那个Sun的程序员, 在AppStore上一夜暴富的故事.  这里就有明显误导的嫌疑了.  这里是说Android, 最好是拿一个Market上面成功的例子.  用iPhone的AppStore成功经历来侧面暗示Android Market也会成功, 很不妥.  很多事情, 不是说你做了个门户很成功, 我也做个一样的, 肯定也成功.  这里最好保留谨慎的态度, 因为目前Market的发展并没有AppStore那么好.  想一夜暴富还很远呢.

关于Market的几个优点, 不敢苟同. 

比如Market默认结合了Web 2.0社区功能.  这个哪里有??
比如Android配合YouTube类似的评分和反馈.  其实大家都知道, Market软件的说明最多是325个字, 而且app的截图上传直到前一段时间才实现.  和苹果的AppStore相比, 相差得很远.

比如数据分析工具.  Google并没有提供任何的分析工具给Android app.  除了付费app在google checkout里面看看销售和付款的数据以外, 其他的什么都没有.  是的, NOTHING!

比如市场广阔.  这个是有点放眼未来的意思.  市场确实广阔, 但各大厂商和手机硬件商都想摆脱google Market的束缚而开发自己的App Store.  目前已经推出的app store就有6,7家了, 而且这种趋势还有井喷的苗头.  对开发者来说, 面对众多的app stores, 到底要花费多少精力来管理app发布呢?

Market最致命的一点, 而且也是让Google最尴尬的一点, 就是Market的搜索烂到不行, 根本不知道这个搜索的算法是谁写的, 比SQL里面的LIKE都差.

(由于我是从后来章节开始往前看的, 所以评论是越到后门越多).

治学要严谨, 写书尤其如此.  本书作者们提供了中国Android开发者第一手的中文材料, 值得表扬.
但是出版前必要的校对和核实是必须的.  可能是上市时间仓促的问题, 所以还有以上一些问题.
希望下个版本可以改进.
   发表时间:2009-10-03   最后修改:2009-10-03
lordhong 写道

第八章
第182页和185页
在updateWithNewLocation(Location location)的方法中:
TextView myLocationText;
myLocationText = (TextView)findViewById(R.id.myLocationText);


这段获取TextView的代码应该在onCreate()里面才合适.  不然每次这个方法被调用, 都要重新new出一个TextView, 内存上的大忌.


窃以为,每次调用findViewById并不会都new一个TextView出来。
不过代码这样写确实不好看哪,应该作为其成员变量,如lordhong大人所说丢在onCreate里面执行比较合理。


不愧是lordhong大人,能从非技术的角度去点评让人收益匪浅。技术可以学,但是技术的环境则是像我这样的业外人士所看不到的。
0 请登录后投票
   发表时间:2009-10-03  
vlinux 写道
lordhong 写道

第八章
第182页和185页
在updateWithNewLocation(Location location)的方法中:
TextView myLocationText;
myLocationText = (TextView)findViewById(R.id.myLocationText);


这段获取TextView的代码应该在onCreate()里面才合适.  不然每次这个方法被调用, 都要重新new出一个TextView, 内存上的大忌.


窃以为,每次调用findViewById并不会都new一个TextView出来。


是, 写得太快了.  我的意思是每次都建立一个本地变量指向那个TextView.
虽然有GC, 但这些变量并非是马上被回收的东西, 所以内存上还是会有问题.
0 请登录后投票
   发表时间:2009-10-04  
lordhong帅哥能不能推荐下学习android比较好的入门书籍或者材料?
0 请登录后投票
   发表时间:2009-10-04  
dennis_zane 写道
lordhong帅哥能不能推荐下学习android比较好的入门书籍或者材料?

http://androidappdocs.appspot.com/guide/topics/fundamentals.html 这个入门最好。
像我这种英文不好的,只能去看国内的入门书了
0 请登录后投票
   发表时间:2009-10-05  
Hong老大写篇对Intent深入理解的文章吧
0 请登录后投票
   发表时间:2009-10-05  
学习了。
Log.e(TAG, e.getMessage(), e); 
这里的TAG指的是什么?
0 请登录后投票
   发表时间:2009-10-05  
大神一定没有用过e.printStackTrace().
是可以的。android log里有个system.err的标签。
所有java错误输出都重定向这个tag里了。
0 请登录后投票
   发表时间:2009-10-05  
jjcang 写道
大神一定没有用过e.printStackTrace().
是可以的。android log里有个system.err的标签。
所有java错误输出都重定向这个tag里了。


logcat是可以看到stack trace, 但我的意思是要使用android的Log框架来记录异常
0 请登录后投票
   发表时间:2009-10-05  
JimyChen 写道
Hong老大写篇对Intent深入理解的文章吧

囧...  只可意会... 不可言传...
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics