`
cloixio
  • 浏览: 2936 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

炮轰 杨丰盛的《Android应用开发揭秘》

阅读更多
看到javaeye很多人在吹嘘、推荐杨丰盛的《Android应用开发揭秘》,个人就买了一本。

首先拿到书时,再次感受到机工出版社的书的纸张独有的“薄如蝉翼、黄如粪便”的特征,不过想着javaeye一众人对书中内容的推荐,纸张的质量我忍了。

接着看书,不过我慢慢发现书中一堆晦涩不清的表述——这种表述可能是我自己的中文理解问题,算了不说了。

但书中还充斥着一堆垃圾代码,看下面书中代码(P270,免得说我诬陷):
	private Runnable _discoveryWorkder = new Runnable() {
		public void run() 
		{
			/* 开始搜索 */
			_bluetooth.startDiscovery();
			for (;;) 
			{
				if (_discoveryFinished) 
				{
					break;
				}
				try 
				{
					Thread.sleep(100);
				} 
				catch (InterruptedException e){}
			}
		}
	};

上面_bluetooth.startDiscovery();就是开始进行蓝牙搜索了,

接下来那段死循环就纯属多余!!代码判断_discoveryFinished为true时结束死循环,但这个死循环什么都没做啊。
事实上,完全可以把这段垃圾代码删除。

我不确定杨丰盛到底会不会Android,但我觉得这java代码写得也太垃圾了。

书中大量这种的代码,让人不堪入目。前几章,看过也就算了,后来发现越来越多
上来发发牢骚。
分享到:
评论
10 楼 cczlg 2012-03-28  
再补充一句,既然对技术要求这么严谨,那么,严谨的说:BroadcastRecevier不是监听蓝牙搜索结束的,而是每发现一个设备就调用一次。但是可以在这里判断action是否等于BluetoothAdapter.ACTION_DISCOVERY_FINISHED来得知搜索过程是否结束。前提还得是注册过BluetoothAdapter.ACTION_DISCOVERY_FINISHED的IntentFilter。
我猜_discoveryFinished就是通过这种方法设置为true的。
9 楼 cczlg 2012-03-28  
这本书我没看过,不能随便说好坏。但你提到的这个例子我觉得它有可取之处。且不考虑CPU和耗电量,就从实现功能上说。我在做一个功能,发现蓝牙设备之后才能进行下一步操作,典型的单线程同步思维。当初Android团队可能是考虑为了不影响UI主线程与用户交互,把startDiscovery做成一个异步方法。那么我这个需求,怎么实现呢?可能还有其它方法能实现,但我觉得杨先生这个方法简单、粗暴、有效。
另外,别有事没事就“炮轰”,人家就写本书而已,有那么大仇么。
8 楼 zhaopian16 2011-04-02  
呵呵,这兄弟挺有意思!上来就炮轰!android垃圾书多了去了,为什么不去轰那些直接翻译API,粘贴API里Demo凑页数的书?非要挑一本写的不错的的来轰?想出名?搞炒作?赚点击率?
人尚且无完人,人家写的是“书”不是宪法,你搞搞清楚!!!

cloixio您老人家晚上好好睡一觉,酝酿一下,明早早起去炮轰红楼、三国、水浒……这样来的快些.
7 楼 cloixio 2011-03-31  
我们再来看杨丰盛这个案例中SamplesUtils类中的代码:
Java代码 
    private static void indeterminateInternal(final Context context, final Handler handler, String message, final Runnable runnable,  
        OnDismissListener dismissListener, boolean cancelable)  
    {  
 
        final ProgressDialog dialog = createProgressDialog(context, message);  
        dialog.setCancelable(cancelable);  
 
        if (dismissListener != null)  
        {  
 
            dialog.setOnDismissListener(dismissListener);  
        }  
        dialog.show();  
 
        new Thread() {  
 
        @Override  
        public void run()  
        {  
         runnable.run();  
 
            handler.post(new Runnable() {  
 
                public void run()  
                {  
 
                    try  
                    {  
 
                        dialog.dismiss();  
                    }  
                    catch (Exception e)  
                    {  
 
                        ; // nop.  
                    }  
 
                }  
            });  
        };  
        }.start();  
    }  


注意粗体字代码部分,这行代码仿佛“神来一笔”,杨丰盛执行线程的方法居然是调用Runnable对象的run方法。

接着再看dialog.dismiss(); 这行代码,就是这行代码,它会让“scanning”对话框消息消失。这就是典型的“用单线程思维编写多线程代码”~
正确的做法:这里直接调用new Thread(runnable).start();启动多线程——把dialog.dismiss();交给监听蓝牙搜索结束的BroadcastRecevier去做。
6 楼 yarin 2011-03-31  
我不知道何种原因,cloixio兄现在不出来回帖了!
因为cloixio兄始终对这个问题纠结着,我30日找到以前的代码运行测试了N次,结果和kangfu兄说的情况一样。
鉴于此次cloixio兄的“炮轰”,对作者及出版社影响甚大,在我得测试结果之后,我并没有上来回帖,而是联系了出版社的编辑,希望编辑能先私下联系cloixio兄本人,同时(编辑也另外又找了几个Android方面比较有经验的朋友进行了测试,结果都是不能按照cloixio兄的做法来去掉那个所谓的“多余的循环”),再上来解决此问题,但是到目前为止未果。
我一直关注着此贴的最新消息,现在是在忍受不了了,加上kangfu兄也再次验证了正确无误的结果,所以我得上来回复了,希望cloixio兄能够出现回答此问题,否则会误导其他读者。
另外,正如编辑所说的,本书并不一定是完美的,但也不至于完全没有任何价值,也不是cloixio兄所谓的,javaeye上大部分都是人云亦云的“鹦鹉”,我一直知道javaeye上有着很多国内外知名的大师。
最后感谢kangfu兄以及所有为正确结果而讨论验证的师兄弟,包括对技术非常认真严肃的cloixio兄。

现在已经越来越多的人测试出结果,如果按你说的去掉循环,搜索对话框根本就弹不出来,或者是只弹出很短的时间。
5 楼 cloixio 2011-03-28  
yarin 写道
只能说明这位仁兄喜欢自己的设备的CPU使用率永远都是100%的。
最大限度的发挥设备的能力。
帮助用户消耗一部分电量。
非常抱歉,本书没有满足你上诉要求!


既然作者用这么NB哄哄的口吻来解释,
我就再发表一下我的看法:

看来作者认为这个死循环是可以让_bluetooth.startDiscovery();这个耗时操作暂停下来,让CPU空闲出来。

看来有必要补充一下多线程的知识了:

这个程序定义了一个线程来执行蓝牙搜索,这条线程只做了2件事情:
1. _bluetooth.startDiscovery();    ——这条代码是个耗时操作。
2. 死循环。

第一种假设:假如_bluetooth.startDiscovery(); 是同步执行的,也就是程序必须等这条代码执行完成后,才会去执行死循环,那死循环能暂停_bluetooth.startDiscovery();这个耗时操作吗?能让CPU空闲出来吗?
 
幸好Android没有这么SB!因为这个操作完全可能会搜索1~3分钟。这里是异步执行的——也就是说死循环与_bluetooth.startDiscovery();其实是并发执行的。那么根据多线程的“基础知识”:当死循环线程
执行Thread.sleep(100)时,系统完全可能会被调度到去执行 _bluetooth.startDiscovery();这个耗时操作,那么死循环有意义吗?
4 楼 yarin 2011-03-24  
你要“污蔑”作者一个人无关紧要,javaeye上如此多高手总不能被你一竿子解决了吧。
3 楼 yarin 2011-03-24  
就在javaeye上给你转一段过来你看看:

你把sleep删掉在Windows上跑跑然后打开任务管理器看看CPU是不是100%,加上sleep()是不是立刻变成0%-1%
不需要Android,随便写个Java程序就可以测试
2 楼 yarin 2011-03-24  
只能说明这位仁兄喜欢自己的设备的CPU使用率永远都是100%的。
最大限度的发挥设备的能力。
帮助用户消耗一部分电量。
非常抱歉,本书没有满足你上诉要求!
1 楼 wdjezym 2011-03-23  
没看过书,不懂蓝牙的菜鸟飘过

那段是等待蓝牙连接完成吧
连接完成前一直sleep

相关推荐

    LINUX之父炮轰说

    ### Linux之父炮轰C++:一场关于编程语言选择的争议 #### 背景介绍 Linus Torvalds,作为Linux操作系统的创始人,在技术界享有极高的声誉。他在开发过程中对各种技术的选择和评估也一直备受关注。本文将探讨Linus ...

    android语音识别两种方法(讯飞+google)

    我之前用google的语音识别一直不行,后来才发现我的google语音服务控件给我删了,安上过后就可以了。经兄弟介绍说,讯飞的语音识别...这里的工程都是网上下载的,为了以后方便找,所以上传一下,不要炮轰我哦~~~呵呵~~~

    Linux之父炮轰C++是糟糕程序员的垃圾语言

    Linux 之父 Linus Torvalds 对 C++ 的炮轰和 Dmitri Kakurin 的回应 Linux 之父 Linus Torvalds 在最近的一篇文章中炮轰 C++,称其为糟糕的语言,认为它会导致非常糟糕的设计选择和低效的抽象编程模型。Torvalds ...

    星辰急便总裁陈平炮轰电商自建物流.docx

    - **服务创新**:电商与物流的跨界竞争促使双方不断探索新的服务模式和技术应用,如智能物流、无人配送等。 ##### 3. 对策建议 - **加强合作**:鼓励电商与物流公司之间建立更加紧密的合作关系,共同提升服务质量...

    大炮轰小鸟

    一个flash as2.0编写的小游戏,可以提供给需要的朋友参考

    javaeye月刊2008年4月 总第2期.pdf

    他强调Spring框架提供的轻量级、模块化和面向切面编程(AOP)等特性,使得开发者能够更高效地构建应用程序,而无需依赖复杂的应用服务器。 2. **PHP语言创造者Gutmans炮轰Java已经输掉Web之战** PHP的创始人Dmitry ...

    真正免费,好用的SD、TF卡数据恢复软件,带注册文件,不能用炮轰我。

    在数字时代,存储设备如SD卡和TF卡已经成为我们日常生活中不可或缺的一部分,它们广泛应用于手机、相机、无人机等设备中。然而,数据丢失是许多用户都可能遇到的问题,可能是由于误删除、格式化、病毒攻击或是硬件...

    iPhone 17或将首次在印度研发;余承东炮轰车企一把手不懂AEB;谷歌聊天机器人“背叛”公司,

    互联网快讯、AI,发展态势,互联网快讯、AI,发展态势互联网快讯、AI,发展态势互联网快讯、AI,发展态势互联网快讯、AI,发展态势互联网快讯、AI,发展态势互联网快讯、AI,发展态势互联网快讯、AI,发展态势互联网...

    devbox:我用作开发箱的 Docker 映像

    我用以下方法炮轰它: docker run -i -t --volumes-from michiel-data devbox /bin/bash 在我完成了我想做的工作并将我的更改推送到 github 之后,我再次输入“exit”退出。 在我的数据容器(在我的 VPS 上称为...

    KC网络电话辅助呼叫

    KC网路电话辅助呼叫 软件自动重播,挂断KC网路电话

    二十三种设计模式【PDF版】

    如果你不能很好的延伸 J2EE 的思想,那你岂非是大炮轰蚊子,认识到 J2EE 不是适合所有场合的人至少是明智的,但我们更 需要将 J2EE 用对地方,那么只有理解 J2EE 此类框架软件的精髓,那么你才能真正灵活应用 Java ...

    scratch编程项目源代码文件案例素材-[僵尸大战1.4].zip

    scratch编程项目源代码文件案例素材-[僵尸大战1.4].zip

    该是普及G语言的时候了——LabVIEW学习

    Linux之父炮轰C++:糟糕程序员的垃圾语言 C语言已经死了,5个需要忘却它的理由 看看9种编程语言的发明者是怎么说的 顺应时代没有不好,但是时代在变,大家在顺应着的“时代”是真正的时代吗? 模糊!就停下来,停...

    卡尺:用于测量图像和PDF尺寸的Node.js库

    构造Calipers的目的是提供一种比炮轰ImageMagick更快,更省资源的方法来确定图像或PDF的尺寸。 在我们必须在API请求有效期内验证图像和PDF的大小。 最简单的方法是将Shell封装到ImageMagick中,以识别文件的类型和...

    authorware7.0 作品--士兵突击

    这是我们课本附赠光盘的 精品赏析 士兵突击的 绝对好资源 如果下了感觉资源不好 你可以直接加我QQ:451092524 来炮轰我

    北京市房山区周口店八年级历史上册 第16课《美国内战》教案.doc

    3. **战争起因**:1861年4月,南方叛军炮轰联邦军驻守的萨姆特要塞,标志着内战正式爆发。林肯当选总统被视为战争的导火线,因为这预示着奴隶制的终结。 4. **战争初期形势**:虽然北方在人口、资源和工业上占有...

    魔音喊麦.kx效果 回荡,爆音

    我画过游子身上衣 也画过慈母念朝夕 我下过隔子炮轰车 也画过丧殡烧头七 花开花落花弥漫 你看我一生多璀璨 忘情挥舞八卦扇 我再次逆天写震撼....... 忆当年 风雨摇摆 曾经我名震四海 现如今我不再主宰 难以...

    用类封装的战舰小游戏

    本程序模拟了一个炮轰战舰的小游戏,战舰由三块组成,随机生成,炮弹由用户输入。击沉则告之,并显示最终分数,仅作为C++入门新手对类的封装的熟悉之用

Global site tag (gtag.js) - Google Analytics