学习资料
很久没写博客了。适逢这次Srtp项目学弟学妹们要学习Java与Android,我就总结一些学习的教材、方法,分享写材料与心得。纯个人观点,如有不周之处欢迎指出,大家共同探讨提高。
教学书籍:
Java基础较差的人去借这本书吧,很简单易懂:
这本书供有一定Java基础的人深造:
第一本看完基本就可以开始做Android练练手了,Java能有今天一方面是其在服务端领域、商业项目上的成熟,一方面不得不承认是Android的功劳,拿Android作为练手学习Java再合适不过了。
第二版不是有一定决心要在Java方面深造的人看不下去。对C#应该也有较大帮助,其中很多设计模式和思想是可以通用的,但对其他语言可能就没那么大作用了。
至于Android进阶深造,我觉得没必要看书。那些厚厚的Android核心大全什么的看不进去,看进去也记不住,记住也不理解。多写多练多逛逛论坛和开源项目吧。这种比较实际的技术更新太快,看书很不值。
廖学峰大神的Git教程
不要觉得和Android开发没关系,Git是现代程序员神器,Github是现代程序员圣地,Git很简单,学好了好处非常多
在线手册:
菜鸟教程Android专区
这个站点供已近有点基础(比如看完第一本书)并且开始做练手项目的同学当手册查。记住是手册,遇到不清楚的查查,不要一章章看,浪费时间
Github上Android相关的优秀开源项目、教材
内容较多。不要花太多精力,随便逛逛遇到感兴趣的就看看。
Google
不是百度不好,在查国内八卦方面它肯定比Google强,但查技术问题还是算了吧。学校是教育网专线,Google偶尔是可以打开的。如果被墙了自行翻墙吧,实在不行,这个,低调食用。再不行就用必应好了。
开发资源:
环境:
- Android相关资源镜像站
- 公共开源的Maven依赖搜索
- 比官方模拟器好用100倍的模拟器 注意这个模拟器安装可能比较麻烦,最好还是用真机调试,万不得已再用这个。
- AIDE吧,掌上学习神器,也能开发 挺好用的,大一没电脑时就是在这上面做出了我的第一个Android游戏。
- Intellij IDEA 最好用的Java|Android集成开发环境,Java界的Visual Studio,对于一般童鞋来说下载免费的社区版IDEA就够用了。
- Visual Studio Code 不是Visual Studio哦,是个更轻量更快捷更方便更好用的
编辑器IDE,毕竟IDEA也不小,有它辅助的话很多地方会方便很多。 - Coding以及它的WebIDE 就我个人而已,开源项目都在Github上,Coding则作为私有仓库,很好用。WebIDE真的能让你做到云端开发,赞一个。
UI:
我的建议
1. 绝对不要用Eclipse、netbeans之类的!yada!dame!
新时代程序猿要用IntelliJ IDEA或者Android Studio!个人更建议前者,后者是基于前者基础上的。IDEA现在也有社区版了,Android Studio更是免费的,已经没有理由再用老古董了
2. 视频什么的不用看,太慢。厚厚的大部头书不要看,太老。
软件行业发展极快,那些很长的教程、很厚的书里的很多东西真的已经没用了。像什么Java applet之类的,现在哪个浏览器还支持啊。好多已废弃的库还被各种老古董们拿来教学,官方都不推荐用了的东西还学它干嘛!
有些书除外,比如Effective Java这样永恒的经典。因为这样的书教的是思想。(但思想也不是绝对不会过时的,如果是不是用Java、C#之类的话,Effective Java里的一些模式其实也没多少用了。)
3. 网上的垃圾代码不要抄!看都不要看!误人子弟!
要参考别人的项目可以去Github,要搜索不懂的问题用Google,那些百度出来的国内抄来抄去的文章,大多不是过时了就是效率极低代码极丑或者干脆不能用
当然网上有很多独立博客写的很不错的,但都被埋没在茫茫搜索结果里了。在你知道怎么识别哪些是垃圾代码之前不要随便抄。
4. 想 > 写 > 说 > 记
最重要的是多思考,然后是多练习,然后是多交流,最后才是多学多记!
最后,不要觉得Java难、Android难!
虽然确实比起python、js什么的烦人多了
多接触些新的思想新的技术,不要怕学习,只要你不怕它就很简单
无论古董们怎么强调说,旧的东西才稳定,当你真正了解了新的技术你就会知道,很多旧的东西真的真的就是垃圾,新的技术就是为了解决掉垃圾而诞生。
群里说Java难的孩纸,我猜你们很可能就是被这些垃圾恶性到了。以下随便列出一些:a. UML:古董们再怎么强调它的重要,这玩意儿也确实该淘汰了。这么说吧,想当年,古董的古董们把流程图看得多么重要,可能某些同学中学时代学习Basic时也学过吧?现在呢?随着Basic过气,几个人写程序还画程序流程图?现在的古董们强调的UML就是那时候的流程图,流程图只适用于最早面向过程编程的时代,到了面向结构的C诞生时就应该淘汰了,但古董们直到面向对象成为大流时才明白这点。UML也类似,只适用于面向对象的编程,现在面向对象已经饱受质疑了,懂了不?
b. Java自带的一些UI组件,尤其applet为代表:要说流程图能锻炼思维(呵呵,玩游戏还能锻炼思维呢),还算有点作用,那么这部分可真的一点作用都没有了。现在谁还拿Java做UI?Android虽然底层是Java,但不是包装成xml了吗,甚至一般都是直接拖拽控件了事。就算要复杂点的操作,调的也是Android自己的UI库。而且Java本身的UI又丑又难用,真想用Java开发带UI的,两个建议,一是借助H5,以浏览器来呈现UI,二是用一些开源绘图渲染库,比如lwjwl(Minecraft底层就是它),或者干脆用开源游戏引擎,比如libGDX。
c. 又老又丑又复杂又难用的开发环境:Eclipse、netbeans什么的吓走了多少新人,又培养了多少代码风格极差、代码效率极低的码农?用IDEA真的很爽,打几个字母敲一下回车,一个程序就出来了。搭配配合轻量时尚的vscode,基本上你所能想到的省力的做法都能实现!
d. 庞大臃肿或底层傻乎乎的web框架:前者以spring mvc之类的为代表,后者是比如servlet和jsp。也不是说这些不好,但现在早已经有了更好的替代品了。一些新兴的web框架从学习到开发到部署到运行的效率都远远超过了它们,为什么不试试呢?(但不得不承认,servlet和jsp还是不能忽略的基础,这两个学好了确实更容易理解其它更高层的框架,这两个学不好后期确实会遇到许多驾驭不了的麻烦。但我认为这是Java本身的错,总要被底层琐事掣肘,不能真正的从更高更新的角度来设计架构。)
e. 复杂的网络通信:很多人可能都被HttpClient恶心到了(实际上HttpClient有很多不同的实现,常见的是Apache包或commons包的,但都不好用),我宁愿去用更底层的HttpUrlConnection也不愿用它。这玩意设计的太懒,Android里都废弃它了。更底层的HttpUrlConnection是UrlConnection的Http版实现,UrlConnection本身设计的挺合理的,虽然较底层,但确实把http和本地资源统一起来了,基于其上的HttpUrlConnection虽然写起来代码量较多,但只要有点Http基础知识还是很容易理解的。与之相比的HttpClient是神马玩意儿,把本来简单的问题复杂化,看起来好像比HttpUrlConnection少了那么些代码,实际上却多出了很多莫名其妙抽象出来的概念。说了这么多,但我一直在强调,HttpUrlConnection虽然好理解好用,但只是比起HttpClient,事实上我推荐的是square的开源项目okhttp,极大的简化了异步网络请求的问题,设计也比较合理,HttpClient那套你就算学会了,换到别的语言里也基本完全没用,因为设计的乱七八糟,但OkHttp,嗯,有点其它语言网络交互基础的人估计一瞬间就明白它是怎么工作的了。
f. 复杂的文件IO:大部分Java教程的文件IO实在实在太底层了,建缓冲区,逐字节读写,判断是否EOF,我天,你是在写汇编么?说底层还是抬举这些教材了,你要真底层,就把文件IO、网络IO、设备交互、控制台输入输出都结合起来讲啊,都是操作stream吗。总之与HttpClient类似的,常见教材的Java文件IO操作也是这么个低不成高不就的玩意儿。一般来说,在写Android时是不太用的上文件IO的,Android既有SharedPreference解决配置存储问题,又有内置的Sqlite3解决数据存储问题,如果要用到图片音乐等媒体资源也都有封装的比较好的库可用。就算一定要用文件,Android也提供了很好的文件操作相关的工具类。如果不是写Android,也没有比较好的文件IO分装,我的建议是你就把它理解成stream,然后稍稍了解一下文件的几种打开标志,写C的人或者会Linux的人应该对此很熟悉,然后统一用ByteArrayOutputStream、ByteArrayInputStream操作好了。
g: 复杂的异步与并发:写Android很重要的一点就是注意渲染线程与耗时线程的交互,准确的说,一旦开发涉及到异步并发问题都会变得复杂,这一点什么语言都逃不掉。但现代设备多核已经普及,这一问题也早有了各种各样的解决方案,诸如队列模型、消息订阅、事件驱动、协程、任务、池子模型、流式调用等等(这里面有些事针对异步,有些针对并发,但没必要区分那么清楚),Java也逐渐把这些吸收了进来,虽然都还谈不上完美,但已经轻松多了。然而,由于国内尤其Java领域内古董尤其多,很多新人都会被复杂的接口回调、线程锁机制吓到。其实在Android中,解决异步主要是通过订阅者模式,很好理解,而在Java web中,大多是事件、或者说请求驱动模式,更好理解,远远没有古董们写的|说的那么难。至于并发,Java1.5提供了一些线程安全的数据集合,Java8也有许多针对并发的新支持(我没亲自体验过),虽然还不如其他一些语言方便,但也轻松太多了。
所以,懂了吗?有些旧的东西,真的不值得再去为它花费时间精力了,最重要的是这很消磨人的兴趣与耐心。