有人可以解释这个java代码

dub*_*eat 6 java android

我刚刚开始使用android,我的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);
            }
        }
    };   
Run Code Online (Sandbox Code Playgroud)

Ric*_*ton 27

  • 这是一个匿名类.实际发生的是Handler使用重写handleMessage函数创建 子类.

    匿名类最优雅的一点是它们允许您在需要的地方准确定义一次性类.此外,匿名类具有简洁的语法,可以减少代码中的混乱.

  • 你还问过"有人可以向我解释究竟是什么final ".可以在这里找到一个很好的解释.

    在您的示例中,final关键字阻止任何人分配新实例/ null变量"handler"的实例,这意味着我无法写入行handler = null;handler = new Handler() { ... }在您的示例代码片段之后.


Cha*_*ins 8

好像我写了那个Java代码;).这是我在Manning书中解锁Android的一个例子 - http://code.google.com/p/unlocking-android/.虽然本书的目的不是详细介绍Java,而是专注于Android,但如果引起混淆,我会道歉.

这里的答案是现场的,这是故意的anon内部类,因为它没有在该上下文之外的任何其他地方使用.

我要补充一点,如果你刚开始使用Android,我会选择一本较新的书.Mark Murphy的CommonsWare书非常好(http://commonsware.com/Android/),他让他们保持最新状态(或者看看Unlocking Android第二版,我没有参与其中,并且没有阅读它所以不能推荐或不推荐,但曼宁正在努力,它可以在他们的网站上尽早访问).

对于一个作者推荐一本非他自己的书可能看起来很奇怪,但事实是现在有一些更好的方法可以在更新的API上做这些事情(这是在1.0级编写,并在事后测试1.5) ).不要误解我的意思,那本书在整体概念(生命周期,活动,意图等)方面仍然有很多价值(我感到自豪),但有更好/更容易/更新的方式获得完成了一些具体任务.

例如,看看AsyncTask(http://android-developers.blogspot.com/2009/05/painless-threading.html),它将为您节省很多处理程序/消息的痛苦.

(我会在这里评论,但我无法弄清楚如何评论而不是"回答",它可能与没有足够的代表有关?)