有人能解释一下这段Java代码吗?

6

我刚开始学习安卓开发,我的Java语言很生疏。我不记得曾经见过像这样嵌套函数的情况。有人能够解释一下final到底是什么,并解释为什么要在一个函数中嵌套另一个函数吗?

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);
            }
        }
    };   
5个回答

27
  • 这是一个匿名类。实际上,它创建了一个Handler子类,并重载了handleMessage函数。

    匿名类最优雅的地方在于可以在需要的地方定义一次性类。此外,匿名类具有简洁的语法,可以减少代码中的冗余。

  • 你还问道“有谁能向我解释final到底是什么”。 这里有一个不错的解释

    对于你的示例而言,final关键字会阻止任何人分配一个新实例或将变量“handler”的实例设为null,这意味着在你的代码片段之后,我不能写下handler = null; 或者handler = new Handler() { ... }


8
看起来我写了那段Java代码;)。这是我在Manning图书《Unlocking Android》中的一个示例http://code.google.com/p/unlocking-android/。虽然该书的目标不是详细介绍Java,而是专注于Android,但如果它引起了困惑,我表示歉意。
这里的答案很准确,故意使用匿名内部类,因为它只在该上下文之外的任何地方使用。
有一点需要补充的是,如果你刚开始学习Android,我建议选择一本更新的书籍。Mark Murphy的CommonsWare系列书籍非常好(http://commonsware.com/Android/),他会及时更新(或者看看《Unlocking Android第二版》,我没有参与其中,也没有阅读过,所以无法推荐或否定,但是Manning正在编写它,并且可以在他们的网站上提前访问)。
虽然作为作者推荐其他书籍可能有些奇怪,但事实上现在有一些更新的API可以更好地完成这些任务(该书是在1.0版本编写的,在事后测试了1.5版本)。不要误会,那本书在整体概念(生命周期、活动、意图等)方面仍有很大价值(我为此感到自豪),但是有更好/更容易/更新的方法来完成某些具体任务。
例如,请查看AsyncTask(http://android-developers.blogspot.com/2009/05/painless-threading.html),它将为您节省许多处理程序/消息痛苦。
(我本来想在这里发表评论,但我无法弄清楚如何进行评论而不是“回答”,这可能与我的声望不够有关?)

是的,您需要50个声望才能发表评论(我看到您刚达到了这个门槛 :))。顺便说一句,我认为这是一个很好的答案。 - ZoogieZork
你好,你的书非常棒!我发现它比很多其他安卓书籍更容易理解。希望你不介意我过多地发布你的代码! :) 我基本上只是浏览所有的例子并分析我不理解的所有部分。 - dubbeat
1
我完全不介意,很高兴你喜欢它,谢谢!我认为里面的很多内容都是核心/基础的,当然仍然适用(我们有意这样写)。只要记住使用时它有点老旧,平台已经发展。它肯定可以帮助理解等方面,但例如对于生产代码,我会选择新的构造(在这种情况下,AsyncTask)。另外,不是在这里推销,只是想让你知道,我正在编写一本更新的书。早期阶段,“Android in Practice”正在进行中。 - Charlie Collins

3

这被称为匿名类。详细解释在这里...(链接)


2

这段代码创建了一个Handler类的实例,并同时重写了Handler类中的"handleMessage"方法。


2

这是一个匿名类,它可以 (a) 实现 Handler 接口或者 (b) 继承 Handler 类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接