最近学做Android app。看例子的时候被一段熟悉的代码看懵了。
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoginActivity.this.onLoginClicked();
}
});
Class.this
是啥?和this
有啥区别?View
是个interface
,为啥能new
?为啥用Anonymous class?以前都学过,一段时间不用全忘了。搜了一天的我把这条线总结一遍方便以后要使用的时候复习。
View
是个interface
,为啥能new
?为啥用Anonymous class?
Java中,Anonymous class有固定的语法。每一次使用的时候就是在instantiate一个Object。interface
当然不能new
,但是以上语法new View.OnClickListener(){}
相当于new
了一个object,它所属的class
是implement View
这个interface
的。和下面的代码的功能差不多。
View.OnClickListener v = new View.Something();
loginButton.setOnClickListener(v);
public interface View {
public interface OnClickListener{
void onClick(View v);
}
public class Something implements TestView.View.OnClickListener{ // Something is the concrete class just for overriding the method
@Override
public void onClick(View v) {
System.out.print("This is Click.");;
}
}
}
很明显这段太长了,v
除了用做被叫里面的onClick
以外也没别的用处,用Anonymous class更方便。
Class.this
是啥?和this
有啥区别?
this
指当前class
自己。Class.this
指那个class
自己。一般用来refer nested class的外部class
的,比如下面的例子(来自stackoverflow)。
class Person{
String name;
public void setName(String name){
this.name = name;
}
class Displayer {
String getPersonName() {
return Person.this.name;
}
}
}
Displayer
里面用this
是Displayer
。如果要用到Person
得Person.this
。这里的this
也不能省略。如果Person.this.name
改成Person.name
就变成叫static member
了。
最开始例子中listener
的叫法是在干什么呢?
这其实是一种实现同步/异步(A/synchronous
)的方式。这种实现一般是用Callback function。Callback
是指把一个方程以parameter的方式发给另一个方程,在执行过某种event之后再执行它的某个功能。为什么搞得这么复杂,干嘛不直接该叫什么就叫什么呢?因为在Java中这种designing pattern
有特定的优势。下面有形象的描述同步/异步的例子。这里有a/synchronous的例子。当然,Java的asynchronous需要用thread
,不然就没法把process弄出分支来。
因为Java不能把method当成parameter传来传去,所以得传一个object过去,再用它的method。这种类型的设计叫Observer Pattern
。这里和这里有对比的两种实现的例子。
这个实现和最开始的例子就很像了。OnClickListener
就是Observer
的interface
。Anonymous Class就是他的一个object。当触屏被激发的时候onClick
会被调动,里面的逻辑就会被运行。
asynchronous和synchronous各有不同的用法。如果处理的先后有顺序,比如排队买票,就要用synchronous。有时候用户点一个按钮,后台要loading data,这时候我们不希望让用户干等着,就要用到asynchronous。
Callback method:
Scenario:
有个包裹这两天会送到你家,包裹里有你给邻居的礼物。所以你一旦收到包裹就应该立即把礼物送给邻居。但是你不在家,所以你留给了你老婆一张便条让她代劳。
你可以告诉你老婆,如果收到包裹就把礼物带给邻居。如果你老婆像个计算机一样傻,她会坐在门口一直等,除此之外什么都不干,直到包裹送到。她拿到包裹马上给邻居送去(synchroneous)。
但是更好的办法是不用一直等,只要收到包裹,送给邻居就行。没收到之前该干嘛干嘛(asynchroneous)。
在这个例子中,收到包裹是一个"event",把里面的礼物带给邻居是"callback"。你老婆像计算机一样run,拿到包裹马上给邻居送去。
·