对象池:在稍微大型一点的软件系统开发中,通常我们会用到内存池,对象池,线程池,连接池等各种各样的池(Pool)
一般来说,对象池有下面几个特征:
(1)对象池中有一定数量已经创建好的对象
(2)对象池向用户提供获取对象的接口,当用户需要新的对象时,便可通过调用此接口获取新的对象。如果对象池中有事先创建好的对象时,就直接返回给用户;如果没有了,对象池还可以创建新的对象加入其中,然后返回给用户
(3)对象池向用户提供归还对象的接口,当用户不再使用某对象时,便可通过此接口把该对象归还给对象池
对象池最大的特点就是优化内存,减少GC增删对象的系统开销,但加锁(多线程)会影响性能
关于在对象池上做互斥是不是会成为瓶颈,这个要平衡来看:内存和CPU之间,你的程序到底更看重哪个。如果看重CPU呢,你觉得对象池上加锁会影响性能,那就索性不要用对象池了;如果你更看重内存,那就牺牲一点CPU,用对象池来优化一下内存的使用。 我的经验呢,一般情况下,对象池上加锁,是不会成为瓶颈的,除非你的程序性能要求非常苛刻。
onSaveInstanceState和onRestoreInstanceState的用处:当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。
注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:
1、当用户按下HOME键时。
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
2、长按HOME键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从activity A中启动一个新的activity时。
5、屏幕方向切换时,例如从竖屏切换到横屏时。
在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行。
总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行。
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。
configChanges与Log
设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,直接执行onConfigurationChanged方法
Java、Tomcat环境变量配置
JAVA_HOME: D:\Java\jdk1.7.0_11
Path: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
CLASS_PATH: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;D:\apache-tomcat-7.0.42\lib
CATALINA_HOME: D:\apache-tomcat-7.0.42
TOMCAT_BASE: D:\apache-tomcat-7.0.42
TOMCAT_HOME: D:\apache-tomcat-7.0.42
SdCard路径的获取
Android4.1之前的版本 sdcard目录为:/mnt/sdcard ; Jelly Bean版本(4.1~4.3)中 sdcard目录为:/storage/sdcard0 因此,为了保持代码兼容,不要用硬编码方式获取路径,
应采用: Environment.getExternalStorageDirectory().getPath()
Ps:Environment.getExternalStoragePublicDirectory(String type)函数,该函数可以返回特定类型的目录,目前支持如下类型:
布局
System.nanoTime
测试性能时可以用到,计时方法,精度到纳秒级别
eg: long sometime=System.nanoTime();
................................................
................................................
System.out.printIn(System.nanoTime()-sometime);
获取当前时间三种方法
import java.util.*;
public class GetTime
{
public static void main(String []abc)
{
int y,m,d,h,mi,s;
Calendar cal=Calendar.getInstance();
y=cal.get(Calendar.YEAR);
m=cal.get(Calendar.MONTH);
d=cal.get(Calendar.DATE);
h=cal.get(Calendar.HOUR_OF_DAY);
mi=cal.get(Calendar.MINUTE);
s=cal.get(Calendar.SECOND);
System.out.println("现在时刻是"+y+"年"+m+"月"+d+"日"+h+"时"+mi+"分"+s+"秒");
}
}
----------------------------------------------------------------------------------------------------------------------------------------------------
public class GetTime{
public static void main(String[] args){
java.util.Calendar c=java.util.Calendar.getInstance();
java.text.SimpleDateFormat f=new java.text.SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒");
System.out.println(f.format(c.getTime()));
}
}
----------------------------------------------------------------------------------------------------------------------------------------------------
public String GetNowDate(){
String temp_str="";
Date dt = new Date();
//最后的aa表示“上午”或“下午” HH表示24小时制 如果换成hh表示12小时制
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss aa");
temp_str=sdf.format(dt);
return temp_str;
}
修饰符访问级别
public: 所有的
protected:自己包里的和其他包里的子类
default:自己包里的
private:自己的类
不推荐使用Parcelable ,更不推荐用Serialization在Activity间传递数据
why is Android not using the built-in Java serialization mechanism? It turns out that the Android team came to the conclusion that the serialization in Java is far too slow to satisfy Android’s interprocess-communication requirements. So the team built the Parcelable solution.
the Parcelable is not meant to be passed to an activity. If you want to start an activity and pass it some data, use abundle. Parcelable is meant to be used only as part of anAIDL definition.
http://stackoverflow.com/questions/5550670/benefit-of-using-parcelable-instead-of-serializing-object
Parcelable中 对象的实例是静态的,进程中传递不会出错,定义为静态类会出错
public static final Parcelable.Creator
public Book createFromParcel(Parcel source) {
return new Book(source);
}
public Book[] newArray(int size) {
return new Book[size];
}
};