Archive for 八月 2013

Java 发送邮件

这里用apache的commons-email(http://commons.apache.org/proper/commons-email/download_email.cgi)和java mail(http://www.oracle.com/technetwork/java/index-138643.html)发送邮件.
我的需求仅仅是在系统异常时发个报警邮件,所以,不涉及到附件之类的东西,代码很简单: Continue reading ‘Java 发送邮件’ »

Android开发 Service和IntentService

Service相信大家都很熟悉,一个没有界面的服务,但其实它不是后台的,所有的代码默认在UI线程执行,若要执行耗时操作,需要新开线程或者使用AsyncTask.
IntentService继承自Service,所以,它也是一个服务,但与Service有些区别:
1,Service默认在UI线程执行,而IntentService的onHandleIntent方法在后台执行
2,Service在start后,如果没有手动stop,会一直存在,而IntentService,在执行完后,自动退出.
如果IntentService未执行完上次任务,再次被start,不会再开一个新线程来执行新任务,而是等待之前的任务执行完,再执行新的任务,待所有任务执行完,再stopSelf.
通过查看IntentService的源码,可以发现,其实原理很简单.在OnCreate里创建一个新线程,得到该线程的Looper对象,通过该Looper对象构建一个Handler,在onStart里把Intent当作参数传给该Handler,以实现在OnCreate里创建的线程里运行的目标.在处理完所有任务后, stopSelf(msg.arg1),该msg.arg1就是startId,即每次startService时自动生成的一个唯一id,stopSelf(startId)方法,会判断传入的startId,是不是最后一次调用startService时生成的startId,如果不是,不会关闭服务,是则关闭.即完成最后一次startService的任务后,才关闭Service.

下面是一个小例子: Continue reading ‘Android开发 Service和IntentService’ »

Android开发 ListView,Gallery,GridView等图片性能优化

ListView,Gallery,GridView等控件,在载入大量图片时,很容易会产生OutOfMemoryError异常,即内存溢出.因为每个应用可用内存是有限的,但是图片却很占内存,JPG,PNG本身就是压缩格式,如果分辨率高,很可能保存到磁盘中只有几百K,但是读到内存中会占用十几M内存.图片一多,自然就OutOfMemoryError了.
解决这个问题,需要考虑两个方面. Continue reading ‘Android开发 ListView,Gallery,GridView等图片性能优化’ »

Android开发 TranslateAnimation和ScaleAnimation动画叠加偏移量的计算

目标:在使用TranslateAnimation移动的同时,用ScaleAnimation放大图片,在屏幕居中显示.
看TranslateAnimation的构造方法:
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
四个参数分别是,动画开始时x座标偏移量,结束时x座标偏移量,开始时y座标偏移量,结束时y座标偏移量,单位像素,有一点搞不懂的是,为什么是float,像素还有半个?
缩放动画
ScaleAnimation(float fromX, float toX, float fromY, float toY)
fromX 宽度起始缩放比例,1为原始大小
toX 宽度最终缩放比例
fromY 高度起始缩放比例,1为原始大小
toY 高度最终缩放比例
在TranslateAnimation里,偏移量还要考虑到scale的影响 Continue reading ‘Android开发 TranslateAnimation和ScaleAnimation动画叠加偏移量的计算’ »

Android开发 获取Activity中的ContentView 尺寸

使用下面的代码,


		 DisplayMetrics dm = new DisplayMetrics();
		 activity.getWindowManager().getDefaultDisplay().getMetrics(dm);

取到的是屏幕的尺寸,如果我们的activity不是全屏的,就会有一个StatusBar的高度,如果有ActionBar,这一部分也要占据一定的高度.
要获取整个View真实的高度,可以给xml中最外层的layout加一个id,在程序中findViewById,再取这个View的高度.
但是,这么做稍微麻烦了一点,其实Android已经给我们定义好了一个id,就是android.R.id.content,不需要在xml中定义,直接findViewById即可,再用getWidth,getHeight
另外,如果用子控件的getRootView方法取到的RootView,也会跟上面的代码一样,包括StatusBar和ActionBar

jQuery 图片载完事件

我想让一张图片在box里水平垂直居中显示,大小不固定,box的高度不固定,但有个最小值,这个需求应该可以用css实现,不需要动到强大的jQuery,但无奈技术太差,没解决,So,想到在载完图片后,用jQuery动态调整margin-top.


$(".original_preview img").load(function(){
	var original_preview_height=$(".original_preview").height();
	var preview_img_height=$(".original_preview img").height();
	var margin_top=(original_preview_height-preview_img_height)/2;
	$(".original_preview img").css("margin-top",margin_top);
});

Css 高度自适应

在chrome中,仅仅有height:auto是不能实现一个box的高度自适应的,如果给这个box加个边框,会发现,即使这个box里有内容,它的上下边框还是并成一条线的,并没有实现高度自应用,还需要加一个属性overflow: auto; 。因为在Ubuntu下开发,只装了Chrome,不保证其他浏览器正常,也不打算兼容IE,相信只要大多数开发者抛弃邪恶的IE,用户自然会主动去升级。