最近学做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,拿到包裹马上给邻居送去。
·