2015 08 24 Daily Summary 小小吐槽一下,又是一个加班木有加班费和调休的部门。呵呵 回归正题,今天学习了一下Java注解,下面是一点笔记。 开发注解 在一般的开发中,只需要通过阅读相关的API文档来了解每个注解的配置参数的含义,并在代码中正确使用即可。 在有些情况下,可能会需要开发自己的注解。这在库的开发中比较常见。注解的定义有点类似接口。 下面的代码给出了一个简单的描述代码分工安排的注解。通过该注解可以在源代码中记录每个类或接口的分工和进度情况。 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Assignment { String assignee(); int effort(); double finished() default 0; } @interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。 方法的名称就是参数的名称,返回值类型就是参数的类型。可以通过default来声明参数的默认值。 在这里可以看到@Retention和@Target这样的元注解,用来声明注解本身的行为。 @Retention用来声明注解的保留策略,有CLASS、RUNTIME和SOURCE这三种,分别表示注解保存在类文件、JVM运行时刻和源代码中。 只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。 @Target用来声明注解可以被添加在哪些类型的元素上,如类型、方法和域等。 处理注解 在程序中添加的注解,可以在编译时刻或是运行时刻来进行处理。在编译时刻处理的时候,是分成多趟来进行的。 如果在某趟处理中产生了新的Java源文件,那么就需要另外一趟处理来处理新生成的源文件。 如此往复,直到没有新文件被生成为止。在完成处理之后,再对Java代码进行编译。 JDK 5中提供了apt工具用来对注解进行处理。apt是一个命令行工具,与之配套的还有一套用来描述程序语义结构的Mirror API。 Mirror API(com.sun.mirror.*)描述的是程序在编译时刻的静态结构。 通过Mirror API可以获取到被注解的Java类型元素的信息,从而提供相应的处理逻辑。具体的处理工作交给apt工具来完成。 编写注解处理器的核心是AnnotationProcessorFactory和AnnotationProcessor两个接口。 后者表示的是注解处理器,而前者则是为某些注解类型创建注解处理器的工厂。 以上面的注解Assignment为例,当每个开发人员都在源代码中更新进度的话,就可以通过一个注解处理器来生成一个项目整体进度的报告。 首先是注解处理器工厂的实现。 public class AssignmentApf...

2015-08-21 每日笔记 今天第一次上传,试验一下。 今天折腾AS环境,一开始以为是内存不够,后来发现是内网不能访问外部maven的jcenter的缘故。那为啥人家能访问外网,权限太少伤不起。 项目中使用如下开源工程,这个周末抽空研究一下。 compile 'com.fasterxml.jackson.core:jackson-core:2.6.1' compile 'com.fasterxml.jackson.core:jackson-annotations:2.6.1' compile 'com.fasterxml.jackson.core:jackson-databind:2.6.1' compile 'com.squareup.okio:okio:1.5.0' compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'com.squareup.retrofit:converter-jackson:1.9.0' 当然还有一些公司内部自己做的aar包,由于没有source,就先不管了,等到项目开展时,自然会接触到怎么做。

Mac10.10下Mysql服务不能停止的解决办法 先说一下这个问题的来源 十有八九是因为10.10之后mysql无法开机自动启动,于是网上有很多采用launchctl来添加自动重启的办法。网上的做法一般是这样的: 在/Library/LaunchDaemons下,增加一个com.mysql.plist,代码如下: <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.mysql</string> <key>ProgramArguments</key> <array> <string>/usr/local/mysql/bin/mysqld_safe</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <false/> </dict> </plist> 然后调用launchctl load -w com.mysql.plist这个来加载plist 那么,重点来了,这样会有一个问题,就是没有办法停止mysql服务。 解决的办法其实很简单,先launchctl list查看一下是否有mysql的自启动服务com.mysql.plist。 如果有的话,调用launchctl unload -w com.mysql.plist卸载这个服务。

Android中如何使用主题属性 另外一种资源值允许你引用当前主题中的属性的值。这个属性值只能在样式资源和XML属性中使用;它允许你通过将它们改变为当前主题提供的标准变化来改变UI元素的外观,而不是提供具体的值。 属性的引用 @表示引用资源,声明这是一个资源引用—随后的文本是以@[package:]type/name形式提供的资源名。 @android:string表明引用的系统的(android.*)资源 @string表示引用应用内部资源 对于id, 可以用@+id表明创建一个id ?表示引用属性 “?”引用主题属性,当您使用这个标记,你所提供的资源名必须能够在主题属性中找到,因为资源工具认为这个资源属性是被期望得到的,您不需要明确的指出它的类型 举个例子: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:clickable="false" android:background="?listview_item_background_selector" android:id="@+id/listview_root"> 这里我们使用了android:background="?listviewitembackground_selector"来获取background的资源。但并没有给出资源的具体位置和类型。 属性的定义 在theme_attr.xml中,定义了需要使用的主题属性。 举个例子: <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="account" format="reference"/> <attr name="account_management" format="reference"/> ... <attr name="listview_item_background_selector" format="reference"/> <attr name="listview_item_refresh_animation" format="reference"/> <attr name="line_drawable" format="reference"/> ... </resources> 如上,之前通过“?listviewitembackground_selector”获取的属性的定义就是在这里给出的,不过也可以看出它的format为reference,所以需要到当前加载的属性中去查找相对应的具体值。 这里没有使用扩展attr时常用的类似如下的写法: <declare-styleable name="MyView"> <attr name="textColor"...

面试杂谈 纪录一些找工作时候被问到的问题,以及自己的理解。 不积跬步,无以成千里。 Android 相对坐标和绝对坐标,请解释一下他们的区别? android的触摸事件一般会传递一个event参数,这个参数有两套获取触摸位置的方法(相对坐标和绝对坐标): getX(), getY():取得当前触摸位置相对于当前调用事件的view的左上角的坐标。(相对坐标) getRawX(), getRawY():取得当前触摸位置相对于整个屏幕左上角的坐标。(绝对坐标) Android 声明周期,及每个生命周期都做哪些工作? 销毁时没有onfinish应该是onDestory 有一个OnRestart方法,onStop后回到前台时调用,之前好多页面刷新其实应该写在这里。 控件初始化setContentView在Oncreate中执行,Onresume中执行恢复在Onpause中被释放的资源,比如braodcastreciever,各种sensor like GPS,等等导致电量消耗的资源。