2010-05-25 80 views
6

我剛剛開始在Android上,我的Java是生鏽的。我不記得曾經看到一個嵌套在另一個函數中的函數。有人可以向我解釋到底是什麼,並解釋爲什麼你會像這樣在另一個嵌套功能?有人可以解釋這個Java代碼

private final Handler handler = new Handler() { 
     @Override 
     public void handleMessage(final Message msg) { 
      Log.v(Constants.LOGTAG, " " + ReviewList.CLASSTAG + " worker thread done, setup ReviewAdapter"); 
      progressDialog.dismiss(); 
      if ((reviews == null) || (reviews.size() == 0)) { 
       empty.setText("No Data"); 
      } else { 
       reviewAdapter = new ReviewAdapter(ReviewList.this, reviews); 
       setListAdapter(reviewAdapter); 
      } 
     } 
    }; 

回答

27
  • 這是一個Anonymous Class。 實際發生的情況是的 子類正在被 創建,並且覆蓋了 handleMessage函數。

    一個約 匿名類最優雅的事情之一是,它們允許你 定義一次性類需要的地方正好 。此外, 匿名類具有簡潔的 語法,可減少您的 代碼中的混亂。

  • 你還問「有人能 向我解釋final 不正是」。一個很好的解釋can be found here

    在你的榜樣的final關鍵字從能夠分配一個新的實例/空的變量「處理程序」,意思是我不能寫行handler = null;handler = new Handler() { ... }您的示例代碼片段之後的實例停止任何人的情況下。

+0

這就是偉大的球員,非常感謝 – dubbeat 2010-05-25 14:04:45

3

這被稱爲匿名類。這裏有一個詳細的解釋。(link)

2

這段代碼創建了一個類Handler的實例,並且同時覆蓋了Handler的「handleMessage」方法。

2

這是一個匿名類,它(a)實現Handler接口或(b)擴展Handler類。

8

看來我寫了那個Java代碼;)。這是我在曼寧書中的一個例子解鎖Android - http://code.google.com/p/unlocking-android/。雖然本書的目標不是詳細介紹Java,而是專注於Android,但是如果引起混淆,我很抱歉。

這裏的答案是斑點,這是故意anon內部類,因爲它沒有在該上下文以外的任何地方使用。

有一點需要注意的是,如果您剛開始使用Android,我會添加一本新書。馬克墨菲的CommonsWare書很好(http://commonsware.com/Android/),他讓他們保持最新(或者看看解鎖Android第二版,我沒有參與,並沒有閱讀它,所以不能推薦或不,但是Manning正在研究它,並且可以在他們的站點儘早訪問)。

作者推薦自己以外的書可能看起來有些奇怪,但事實是現在有更好的方法可以在更新的API上編寫這些東西(它是在1.0級別編寫的, 1.5之後)。不要誤會我的意思,那本書在整體概念(生命週期,活動,意圖等)方面仍然有很多價值(我爲此感到自豪),但是有更好/更簡單/更新的方法可以獲得一些特定的任務完成。

例如,看看AsyncTask(http://android-developers.blogspot.com/2009/05/painless-threading.html),它會爲您節省很多處理程序/消息的痛苦。

(我會在這裏評論,但我無法弄清楚如何評論,而不是「的回答,」這可能與不具有足夠的代理商呢?)

+0

是的,你需要50名代表發表評論(我發現你剛剛達到了這個門檻:))。 FWIW,我認爲這是一個很好的答案。 – ZoogieZork 2010-05-26 21:08:11

+0

嗨, 你的書很棒!我發現跟很多其他Android書籍相比,它更容易遵循。希望你不要介意我張貼你的代碼太多! :)我基本上只是通過所有的例子,並檢測所有的位,我不明白 – dubbeat 2010-05-28 08:48:34

+1

我不介意,很高興你喜歡它,謝謝! 我認爲那裏有很多東西是核心/基礎的,當然還是適用的(我們試圖以這種方式故意寫它)。在使用它時,請記住它有點老,並且平臺已經發展。它當然可以幫助理解等,但對於生產代碼,例如,我會使用新的構造(在這種情況下,AsyncTask)。 此外,不要在這裏拉皮條,但只是爲了讓你知道,我正在寫一本更新的書。早期階段,但「Android實踐」正在進行中。 – 2010-05-28 16:02:37