分类 Coding 下的文章

路上在网上瞎逛,忽然见得此文,特转载过来(如有版权问题请原创联系路上)

注:此文转载自此仁兄(2012.05)
  1. 为Activity声明系统配置变更事件
    系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果Activity没有声明处理这些事件,发生事件时,系统会把Activity杀掉然后重启,并尝试恢复状态,Activity有机会通过onSaveInstanceState()保存一些基本数据到Bundle中,然后此Bundle会在Activity的onCreate()中传递过去。虽然这貌似正常,但是这会引发问题,因为很多其他的东西比如Dialog等是要依赖于具体Activity实例的。所以这种系统默认行为通常都不是我们想要的。
    为了避免这些系统默认行为,就需要为Activity声明这些配置,如下二个是每个Activity必须声明的:

    \<activity android:configChanges="orientation|keyboardHidden">

    几乎所有的Activity都要声明如上,为什么Android不把它们变成Default的呢?

  2. 尽量使用Android的API
    这好像是废话,在Android上面开发不用Android API用什么?因为Android几乎支持Java SE所有的API,所以有很多地方Android API与Java SE的API会有重复的地方,比如说对于文件的操作最好使用Android里面Context封装的API,而不要直接使用File对象:

    Context.openFileOutput(String); // no File file = new File(String)

    原因就是API里面会考虑到Android平台本身的特性;再如,少用Thread,而多使用AsyncTask等。

  3. 要考虑到Activity和进程被杀掉的情况
    如了通常情况退出Activity外,还有Activity因其他原因被杀的情况,比如系统内存过低,系统配置变更,有异常等等,要考虑和测试这种情况,特别是Activity处理重要的数据时,做好的数据的保存。
  4. 小心多语言
    有些语言真的很啰嗦,中文或英文很简短就能表达的事情到了其他语言就变的死长死长的,所以如果是wrap_content就可能把其他控制挤出可视范围; 如果是指定长度就可能显示不全。也要注意特殊语言比如那些从右向左读的语言。
  5. 不要用四大组件去实现接口
    一是组件的对象都比较大,实现接口比较浪费,而且让代码更不易读和理解; 另外更重要的是导致多方引用,可能会引发内存泄露。
  6. 用getApplication()来取Context当参数
    对于需要使用Context对象作为参数的函数,要使用getApplication()获取Context对象当参数,而不要使用this,除非你需要特定的组件实例!getApplication()返回的Context是属于Application的,它会在整个应用的生命周期内存在,远大于某个组件的生命周期,所以即使某个引用长期持有Context对象也不会引发内存泄露。
  7. 主线程只做UI控制和Frameworks回调相关的事。附属线程只做费时的后台操作。交互只通过Handler。这样就可以避免大量的线程问题。
  8. Frameworks的回调不要做太多事情仅做必要的初始化,其他不是很重要的事情可以放到其他线程中去做,或者用Handler Schedule到稍后再做。
  9. 要考虑多分辨率
    至少为hdpi, mdpi, ldpi准备图片和布局。元素的单位也尽可能的使用dip而不要用px。
  10. 利用Android手机的硬键
    几乎所有的Android手机都有BACK和MENU,它们的作用是返回和弹出菜单,所以就不要再在UI中设计返回按扭和菜单按扭。很多优秀的应用如随手记和微信都有返回键,他们之所以有是因为他们都是从iOS上移植过来的,为了保存体验的一致,所以也有了返回和菜单。但这不够Android化,一个纯正的Android是没有必须重复硬键的功能的。

微评:实际上此文还远远不够,其实这种“注意事项”问题,正是《代码大全》、《程序员修炼之道》、《程序设计实践》、《编程诛讥》之类的优秀书籍所针对和试图解决的问题。如果说编程本身是,那么如何更好的编程则是,对于道的探讨,已经是一个非常高的级别的。年轻的时候,总想抛去直接学,但是形如空中楼阁没有基础显然不会安稳,所以回过头看,任何的学习,都是在的充分掌握之后,慢慢由内自然滋生或者由外点拨出来的。这个过程,路上称之为

Android本身是在linux内核上的一套定制操作系统,而app运行环节则是在Android上定制的Java虚拟机。很多app功能的实现除了调用系统函数意外,还需要具有存储和网络功能,我们可能还需要搭建网络服务器来满足app的特定请求。所以,为了开发Android应用程序,所以以上提到的周边都需要(深入)学习。我们可以把它们分成Java基础,Linux基础,Android基础,存储和数据库基础,网站/服务器基础

注:此文参考观点1

一. Java 基础

1.1 Java基础语法 参考《Java知识点列表》v1.0

  • 开发环境:Java SDK 下载和安装、环境变量的配置(path和classpath)
  • 编程基础:标识符命名规范、Java数据类型、运算符与表达式、流控制(if, switch, for, while),函数
  • 面向对象基础:面向对象与面向过程(结构)之间的区别、面向对象基本思想(封装)、类的定义方法、对象和类的关系、对象的创建方法、通过对象使用成员变量和成员函数的方法、构造函数的作用、函数的重载、static的作用、this(self)的作用
  • 面向对象高级:继承(基本思想、作用、语法特点)、super的使用方法、多态(基本思想)、对象的向上转型和向下转型、final关键字的作用、接口和抽象类(定义方法、语法特征、在面向对象中的地位和意义)、设计模式(工厂方法模式)、Java当中异常的定义、异常的分类以及各自的特点、异常(try…catch…finally结构的使用方法、throw和throws的使用方法、自定义异常的使用方法)、内部类(定义方法、常见使用方法、匿名内部类的定义方法)
  • 线程:线程的定义、在Java中实现线程的两种方法、线程运行状态介绍(准备、运行、阻塞、死亡)、线程间通讯的方法、线程同步、线程死锁
  • IO:IO基本概念、输入流和输出流的作用、Java当中IO流的分类方法、常见IO类的使用方法
  • 常见类库:类集框架、日志相关类库的使用方法

1.2 设计模式

下列23中模式引用此文
  • 创建型模式工厂方法模式、抽象工厂模式、单例模式、创造者模式、原型模式
  • 结构型模式适配器模式、装饰器模式、代理模式、桥接模式、组合模式、享元模式
  • 行为型模式策略模式模板方法模式观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
  • 其他模式:并发型模式、线程池模式、MVC模式

模式之间关系如下图所示
java.model.relationship.jpg

  • 书籍资源:《Effective Java》 、《Agile Software Development:Principles, Patterns and Practices》和《head first 设计模式》

二. Linux基础

  • 《鸟哥的私房菜》
  • 内核API

三. Android 基础

3.1 Android 基本

  • Android开发和调试环境、Android应用结构、界面组件与界面编程、资源管理、四大组件

3.2 Android 中级

  • 文件IO与SQLite、图形图像与动画、音频视频的录制与播放、传感器编程、GPS应用

3.3 Android 高级

  • 网络编程、OpenGL-ES 3D开发、Java和C相互调用

3.4 资源

四. 存储和数据库基础

4.1 存储

4.2 数据库

  • SQLite

五. 网站/服务器基础

5.1 前端

  • HTML5基础:基本HTML和HTML5标签、常见表单标签
  • CSS3基础:基本CSS3语法、bootstrap等框架
  • JavaScript基础:JavaScript基本语法、JavaScript面向对象基础、JSON语法
  • Ajax:XMLHttpRequest和异步请求、发送请求和处理响应、常见Ajax库(jQuery等)

5.2 后端

  • 语言:php、python、Java、asp任意一种以上
  • 数据库:MySQL、noSQL等任意一种以上
  • XML:XML基本规则、DTD和Schema、XML和样式表、基于XML的数据交换

1. 搭梯子方式

方法:vpn等
优点:google上拿第一手的package,新鲜的就是好
劣势:传统上网方式不可以,vpn一般而言都要花钱,速度也是需要花钱换

2. 国内Android SDK 镜像

方法:

  1. 选择国内一个Android SDK 镜像网站

    • 北京化工大学镜像站(快) ubuntu.buct.edu.cn
    • 大连东软信息学院(慢) mirrors.neusoft.edu.cn
  2. 打开Android SDK Manager -> tools -> options. 在sever处填入以上镜像网址,port(端口)填80,并勾选下面的force https://...sources to be fetched using http://... 然后保存。 之后在Packages菜单栏下选择reload即可

优点:稳定,因为是国内的镜像网站
劣势:不一定是google最新版本,速度不一定快

SAE memcache

SAE的memcache基本继承了php本身的memcached,基于memcached有所优化

Typecho Mostcache 插件

Mostcache插件提供了MySQL的cache和SAE的memcache两种方案,因为路上部署在SAE上面,所以直接使用memcache方案。

使用memcache后,chrome浏览器的函数调用从53000+降低到了5300左右,也就是说只有原来的十分之一,而IE11和firefox则更加明显,直接降低到700-800,即只有原来的1.4%左右。换而言之,使用memcache后,性能提升明显。

使用cache后IE/firefox的函数调用图
callgraph1426240020-752.png

究其原因,因为Typecho在设计之初,对数据库进行了充分(过分)的抽象,导致加载页面的时候,会产生过多(复杂)的数据库查询。这就降低了整个网站的效率。

从第一个图片可以看出,在数据库查询是,对mysql_query的查询Inc:104.455ms,Excl:104.455ms,产生了62次调用;对Tyecho_Db_Query::filterColumn的查询Inc:101.316ms,Excl:87.362ms,产生了234次调用,而其对ctype_alnum则有15736次调用。两个大的数据库查询函数调用占到了接近50%(25%+24%)的总执行时间(416.407ms)。从第三个图,也就是采用了cache之后IE访问的函数调用图可以看到:总的执行时间为46.084ms,而且关于数据库查询的时间占用也下降到了<20%。

这再次说明cache是多么的重要!

意外发现

  1. chrome 对后台的调用比IE和firefox多了7倍(5300/750),而且还调用了两次
  2. 采用了gzip压缩网站之后,经常会出现ERR_CONTENT_DECODING_FAILED的错误,导致网站加载失败。。

为什么选择 Typecho

之前花了一个星期调试和优化emlog,使其能够更好的运行在SAE上。但是搞来搞去没搞个结果的时候,(准确说是寻找一个好用的markdown 框架/编辑器的时候),突然注意到Typecho。Typecho简单漂亮的界面吸引到了我,如果继续搞emlog,我还要进行前端的大修(HTML5+CCS3化),这是一个巨大的工程。但是Typecho则完全不用,前端非常简洁和漂亮。就如Typecho官网所说的那样,作为一个写代码的,有时候需要的就是些简单高效记录自己思考和学习的轻博客而已。Typecho很符合这个要求,也符合我的需求。而且居然已经有了SaeUpload这样适用于SAE 环境的插件,免得我再去coding。只是尼玛一个星期的时间完全做无用功实在是浪费啊

如何部署在SAE上

因为之前部署emlog的时候使用的是SAE上面的应用,结果发现其版本严重落后,导致增加了大量的后续修补工作。所以这次部署Typecho时,虽然SAE也有应用,但是还是采用了下载Typecho官方版本,然后再部署到SAE的方式。

步骤

  1. 新建一个应用,使用带有svn的IDE(Netbeansphpstorm等)update这个应用仓库来创建一个新的项目
  2. 从官网上下载最新版本的Typecho,合并到新创建的项目中,再commit到应用仓库中
  3. 下载SaeUpload插件,合并到项目中,再commit到应用仓库
  4. 输入 应用网址/install.php Typecho会识别出SAE环境,按照指引填入信息。由于SAE不能直接写入文件,所以Typecho会提示手动建立config.inc.php文件。
  5. 在IDE或者SAE提供的代码编辑器中建立config.inc.php文件,复制Typecho产生的内容保存到其中。如果是IDE下建立则还需要合并config.inc.php文件并commit到应用仓库中。
  6. 登录刚才建立的Typecho博客后台,开启SaeUpload功能。至此,Typecho博客系统就算真正部署在SAE上面了。

后续

  1. 添加了几个插件

    • google code prettify : 让代码部分看起来更漂亮一些
    • 多说插件: 使用多说社会化评论框架
  2. 添加了几个分类

    • 生活
    • Code (Android, webfrontend,webbackend)
  3. 想完成的事情

    • 同步所发日志到各个平台(Qzone, LJ, etc.)
    • 添加除了首页之外的其他分类