最近學做Android app??蠢拥臅r候被一段熟悉的代碼看懵了。
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoginActivity.this.onLoginClicked();
}
});
Class.this是啥?和this有啥區(qū)別?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有啥區(qū)別?
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的叫法是在干什么呢?
這其實是一種實現(xiàn)同步/異步(A/synchronous)的方式。這種實現(xiàn)一般是用Callback function。Callback是指把一個方程以parameter的方式發(fā)給另一個方程,在執(zhí)行過某種event之后再執(zhí)行它的某個功能。為什么搞得這么復雜,干嘛不直接該叫什么就叫什么呢?因為在Java中這種designing pattern有特定的優(yōu)勢。下面有形象的描述同步/異步的例子。這里有a/synchronous的例子。當然,Java的asynchronous需要用thread,不然就沒法把process弄出分支來。
因為Java不能把method當成parameter傳來傳去,所以得傳一個object過去,再用它的method。這種類型的設計叫Observer Pattern。這里和這里有對比的兩種實現(xiàn)的例子。
這個實現(xiàn)和最開始的例子就很像了。OnClickListener就是Observer的interface。Anonymous Class就是他的一個object。當觸屏被激發(fā)的時候onClick會被調動,里面的邏輯就會被運行。
asynchronous和synchronous各有不同的用法。如果處理的先后有順序,比如排隊買票,就要用synchronous。有時候用戶點一個按鈕,后臺要loading data,這時候我們不希望讓用戶干等著,就要用到asynchronous。
Callback method:
Scenario:
有個包裹這兩天會送到你家,包裹里有你給鄰居的禮物。所以你一旦收到包裹就應該立即把禮物送給鄰居。但是你不在家,所以你留給了你老婆一張便條讓她代勞。
你可以告訴你老婆,如果收到包裹就把禮物帶給鄰居。如果你老婆像個計算機一樣傻,她會坐在門口一直等,除此之外什么都不干,直到包裹送到。她拿到包裹馬上給鄰居送去(synchroneous)。
但是更好的辦法是不用一直等,只要收到包裹,送給鄰居就行。沒收到之前該干嘛干嘛(asynchroneous)。
在這個例子中,收到包裹是一個"event",把里面的禮物帶給鄰居是"callback"。你老婆像計算機一樣run,拿到包裹馬上給鄰居送去。
·