小白日记 (一)
知识点一:getInstance方法和使用(转载自http://blog.sina.com.cn/s/blog_a5854e830102v8ll.html)
答: 在单例模式下使用 。
单例模式:所谓单例模式就是一个类有且只有一个实例,不像object ob=new object();的这种方式去实例化后去使用。
getInstance与new区别:
new的使用:如Object _object = new Object(),这时候,就必须要知道有第二个Object的存在,而第二个Object也常常是在当前的应用程序域中的,可以被直接调用的
getInstance的使用:在主函数开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它的引用,即内存中有一块区域专门用来存放静态方法和变量,可以直接使用,调用多次返回同一个对象。
两者区别对照:
大部分类(非抽象类/接口/屏蔽了constructor的类)都可以用new,new就是通过生产一个新的实例对象,或者在栈上声明一个对象 ,每部分的调用用的都是一个新的对象。
getInstance是少部分类才有的一个方法,各自的实现也不同。getInstance在单例模式(保证一个类仅有一个实例,并提供一个访问它的全局访问点)的类中常见,用来生成唯一的实例,getInstance往往是static的。
(1) 对象使用之前通过getinstance得到而不需要自己定义,用完之后不需要delete;
(2)new 一定要生成一个新对象,分配内存;getInstance() 则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;
(3) new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。
知识点二: extends和Implements区别(转载自http://blog.csdn.net/tolcf/article/details/46135645)
1、在类的声明中,通过关键字extends来创建一个类的子类。
一个类通过关键字implements声明自己使用一个或者多个接口。
extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法;
implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用
2、extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承
JAVA中不支持多重继承,但是可以用接口 来实现,这样就要用到implements,继承只能继承一个类,
但implements可以实现多个接口,用逗号分开就行了 比如 :
class A extends B implements C,D,E
接口实现的注意点:
a.实现一个接口就是要实现该接口的所有的方法(抽象类除外)。
b.接口中的方法都是抽象的。
c.多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。
extends, 可以实现父类,也可以调用父类初始化 this.parent()。而且会覆盖父类定义的变量或者函数。这样的好处是:架构师定义好接口,让工程师实现就可以了。整个项目开发效率和开发成本大大降低。 implements,实现父类,子类不可以覆盖父类的方法或者变量。即使子类定义与父类相同的变量或者函数,也会被父类取代掉。
这两种实现的具体使用,是要看项目的实际情况,需要实现,不可以修改implements,只定义接口需要具体实现,或者可以被修改扩展性好,用extends。
知识点三:@Override作用与解析
@Override是伪代码,所以是可写可不写的.它表示方法重写,写上会给我们带来好处.
1.可以当注释用,方便阅读.
2.告诉阅读你代码的人,这是方法的复写.
3.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.
知识点四: 回调函数(两位大神写的)
http://blog.csdn.net/xiaanming/article/details/8703708/
http://ifeve.com/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%EF%BC%9A-java%E5%9B%9E%E8%B0%83%E6%9C%BA%E5%88%B6%E5%BC%82%E6%AD%A5/
知识点五:TextUtils 自动工具类(转自:http://www.jb51.net/article/126705.htm
Log.d(TAG, TextUtils.isEmpty("Hello") + "");
//判断是否只有数字
Log.d(TAG, TextUtils.isDigitsOnly("Hello") + "");
//判断字符串是否相等
Log.d(TAG, TextUtils.equals("Hello", "Hello") + "");
//获取字符串的倒序
Log.d(TAG, TextUtils.getReverse("Hello", 0, "Hello".length()).toString());
//获取字符串的长度
Log.d(TAG, TextUtils.getTrimmedLength("Hello world!") + "");
Log.d(TAG, TextUtils.getTrimmedLength(" Hello world! ") + "");
//获取html格式的字符串
Log.d(TAG, TextUtils.htmlEncode("<html>\n" +
"<body>\n" +
"这是一个非常简单的HTML。\n" +
"</body>\n" +
"</html>"));
//获取字符串中第一次出现子字符串的字符位置
Log.d(TAG, TextUtils.indexOf("Hello world!", "Hello") + "");
//截取字符串
Log.d(TAG, TextUtils.substring("Hello world!", 0, 5));
//通过表达式截取字符串
Log.d(TAG, TextUtils.split(" Hello world! ", " ")[0]);
结果如下:
这其中重点讲讲如何使用TextUtils.isEmpty()。
是否为空字符 static boolean isEmpty(CharSequence str) 这个函数在我们判断字符串为空时经常可以用到。
这里注意一点,空格返回的也是false。
/**
* Returns true if the string is null or 0-length.
* @param str the string to be examined
* @return true if str is null or zero length
*/
public static boolean isEmpty(CharSequence str) {
if (str == null || str.length() == 0)
return true;
else
return false;
}
如果传入是空格,字符串的长度不会为0,因此返回时false。为了判断EditText输入的是否为空字符串,可以将字符串先trim(),再传入isEmpty,就能成功判断了。
知识点六:Message和Handler
一.消息处理类(Handler)简介
消息处理类Handler允许发送和处理Message或Runnable对象到其所在线程的MessageQueue中。Handler主要有一下两个作用:
1.将Message或Runnable应用post()或sandMessage()方法发送到MessageQueue中,在发送时可以指定延迟时间、发送时间以及要携带的Bundle数据。当MessageQueue循环到该Message时,调用相应的Handler对象的handlerMessage()方法对其进行处理。
2.在子线程中与主线程进行通信,也就是在工作线程中与UI线程进行通信。
*在一个线程中,只能有一个Looper和MessageQueue,但是可以有多个Handler,而且这些Handler可以共享一个Looper和MessageQueue。
Handler类提供的发送和处理消息的常用方法如下表:
[plain] view plain copy
void handleMessage(Message msg):处理消息的方法,该方法通常用于被重写。
final boolean hasMessage(int what):检查消息队列是否包含what属性指定值的消息。
final boolean hasMessage(int what,Object object):检查消息队列中是否包含what属性为指定且object属性为指定指定对象的消息。
Message obtainMessage():获取消息。
sendEmptyMessage(int what):发送空消息。
final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定多少毫秒之后发送空消息。
final boolean sendMessage(Message msg):立即发送消息。
final boolean sendMessageAtTime(Message msg,long uptimeMillis):定时发送消息。
final boolean sendMessageDelayed(Message msg,long delayMillis):指定多少毫秒之后发送消息。
二.消息类(Message)简介
消息类(Message)被存放在MessageQueue中,一个MessageQueue中可以包含多个Message对象,每个Message对象可以通过Message.obtain()或Handler.obtainMessage()方法获得。一个Message对象有如下5个属性:
[plain] view plain copy
arg1 int类型 用来存放整型数据
arg2 int类型 用来存放整型数据
what int类型 用来保存消息标示
obj Object类型 是Object类型的任意对象
replyTo Messager类型 用来指定此Message发送到何处的可选Message对象
*使用Message类的属性可以携带int类型数据,如果要携带其他类型的数据,可以先将要携带的数据保存到Bundle中对象中,然后通过Message类的setData()方法将其添加到Message中。
如:
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putInt("int", 1);
bundle.putBoolean("boolean", false);
bundle.putByte("byte", (Byte) null);
bundle.putChar("char",'a');
bundle.putCharSequence("Stirng","Hello World");
bundle.putFloat("float", 12.3f);
bundle.putString("String", "Hello World");
bundle.putDouble("double", 12.3);
msg.setData(bundle);
Message类的使用方法比较简单,在使用时,需注意以下3点:
a.尽管Message有public的默认构造方法,但是通常情况下,需要使用Message.obtaion()或Handler.obtainMessage()方法来从消息池中获得空消息对象,以节省资源。
b.如果一个Message只需要携带简单的int型信息,应优先使用Message.arg1和Message.arg2属性来传递信息,这比用Bundle更节省内存。
c.尽可能使用Message.what来标识信息,以便用不同方式处理Message。