2010-05-25 3 views
6

Я только начинаю работать на андроиде, и моя java verry ржавая. Я не помню, чтобы когда-либо видел функцию, вложенную в другую функцию, подобную этой ранее. Может ли кто-нибудь объяснить мне, что именно делает и объясняет, почему вы вложили бы функцию в другую?Может кто-нибудь объяснить этот код 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. На самом деле происходит то, что подкласс Handler составляет , созданный с переопределенным handleMessage.

    Один из самых элегантных вещей анонимных классов является то, что они позволяют определить класс один выстрел точно , где это необходимо. Кроме того, анонимные классы имеют сжатый синтаксис , который уменьшает беспорядок в вашем коде .

  • Вы также спросили: «Может ли кто-нибудь объяснить мне именно то, что final делает». Хорошее объяснение can be found here.

    В случае вашего примера final ключевое слово останавливает никого от того, чтобы назначить новый экземпляр/пустой экземпляр переменного «обработчик» означает, я не могу написать строку handler = null; или handler = new Handler() { ... } после примера фрагмента кода.

+0

Вот отличные ребята, высоко ценится – dubbeat

3

Это анонимный класс. Подробное объяснение доступно здесь .... (link)

2

Этот код создает экземпляр класса Handler и в то же время переопределяет метод handleMessage обработчика.

2

Это анонимный класс, который (а) реализует интерфейс Handler или (b) расширяет класс 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 Second edition, я не занимаюсь этим и не читал, поэтому не могу рекомендовать или нет, но Manning работает над этим, и он доступен как ранний доступ на своем сайте).

Может показаться странным для автора рекомендовать книгу, отличную от его собственной, но, правда, есть несколько лучших способов сделать это сейчас на новых API (это было написано на уровне 1.0 и проверено на 1,5 после факта). Не поймите меня неправильно, эта книга по-прежнему имеет большую ценность (которой я горжусь) с точки зрения общих концепций (жизненный цикл, действия, намерения и т. Д.), Но есть лучшие/более легкие/более новые способы получить некоторые конкретные задачи.

Например, посмотрите на AsyncTask (http://android-developers.blogspot.com/2009/05/painless-threading.html), и это сэкономит вам много проблем с обработкой/сообщением.

(я бы заметил, но я не могу понять, как это комментировать, а не «ответ», это может быть связано с не имея достаточно респ?)

+0

Да, вам нужно 50 rep, чтобы публиковать комментарии (и я вижу, что вы просто набрали этот порог :)). FWIW, я думаю, что это прекрасный ответ. – ZoogieZork

+0

Hi, Ваша книга замечательная! Мне было намного легче следовать, чем многим другим книгам-андроидам. Надеюсь, ты не возражаешь, что я слишком часто отправляю свой код! :) Я в основном просто просматриваю все примеры и обманываю все биты, которые я не понимаю – dubbeat

+1

Я совсем не против, рад, что вам понравилось, и спасибо! Я думаю, что многое из того, что есть в нем, является основным/фундаментальным и, конечно же, все еще применяется (мы пытались написать его таким образом намеренно). Просто имейте в виду, когда используете его, что он немного старше, и платформа развилась. Это, безусловно, может помочь в понимании и т. Д., Но для производственного кода, например, я бы пошел с новыми конструкциями (в этом случае AsyncTask). Кроме того, чтобы не сутенерствовать здесь, но только для того, чтобы сообщить вам, я работаю над обновленной книгой. Ранние этапы, но «Android на практике» идут полным ходом. –

Смежные вопросы