我刚开始使用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);
}
}
};
答案 0 :(得分:27)
这是Anonymous Class。
实际发生的是a
Handler
的子类正在存在
用重写创建
handleMessage
功能。
最优雅的事情之一 匿名类是他们允许的 你要准确定义一次性课程 在哪里需要。此外, 匿名课程简洁明了 减少你的混乱的语法 代码。
你还问过“有人可以
准确地向我解释final
做一个很好的解释can be
found here。
对于您的示例,final
关键字阻止任何人分配新实例/ null变量“handler”的实例意味着我不能写行handler =
null;
或{{ 1}}在您的示例代码段之后。
答案 1 :(得分:8)
似乎我写了那个Java代码;)。这是我在Manning书中解锁Android的一个例子 - http://code.google.com/p/unlocking-android/。虽然本书的目的不是详细介绍Java,而是专注于Android,但如果引起混淆,我会道歉。
这里的答案是现场的,这是故意的一个匿名内部类,因为它没有在该上下文之外的任何其他地方使用。
我想补充一点,如果你刚开始使用Android,我会选择一本较新的书。 Mark Murphy的CommonsWare书非常好(http://commonsware.com/Android/)并且他保持最新状态(或者看看解锁Android第二版,我没有参与其中,并且没有阅读它所以不能推荐或不是,但曼宁正在研究它,它可以在他们的网站上尽早访问)。
作者推荐一本非他自己的书可能看起来很奇怪,但事实上现在有一些更好的方法可以在更新的API上做这些事情(以1.0级编写,并在1.5上测试)事后)。不要误解我的意思,那本书在整体概念(生命周期,活动,意图等)方面仍然有很多价值(我感到自豪),但有更好/更容易/更新的方式获得完成了一些具体任务。
例如,看一下AsyncTask(http://android-developers.blogspot.com/2009/05/painless-threading.html),它会为你节省很多处理程序/消息的痛苦。
(我会在这里评论,但我无法弄清楚如何评论而不是“回答”,这可能与没有足够的代表有关?)
答案 2 :(得分:3)
这称为匿名类。这里有一个详细的解释.... (link)
答案 3 :(得分:2)
此代码创建类Handler的实例,同时覆盖Handler的“handleMessage”方法。
答案 4 :(得分:2)
这是一个匿名类,它(a)实现Handler接口或(b)扩展Handler类。