Может кто-нибудь объяснить этот код Java - PullRequest
6 голосов
/ 25 мая 2010

Я только начинаю на Android, и моя 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 голосов
/ 25 мая 2010
  • Это анонимный класс . На самом деле происходит то, что подкласс Handler в настоящее время создано с переопределением handleMessage функция.

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

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

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

8 голосов
/ 26 мая 2010

Кажется, я написал этот код Java;). Это один из моих примеров в книге Мэннинга «Разблокировка Android» - http://code.google.com/p/unlocking-android/. Хотя цель книги состояла не в том, чтобы подробно описать Java, а в том, чтобы сосредоточиться на Android, я прошу прощения, если это вызвало путаницу.

Ответы здесь точны, это намеренно анон внутренний класс, потому что он не используется нигде, кроме этого контекста.

Одна заметка, которую я хотел бы добавить, хотя, если вы только начинаете работать с Android, я бы выбрал более новую книгу. Книги Марка Мерфи «CommonsWare» довольно хороши (http://commonsware.com/Android/), и он держит их в актуальном состоянии (или, может быть, посмотрите на «Разблокировка Android», второе издание, я этим не занимаюсь и не читал, поэтому не могу рекомендовать или нет, но Мэннинг работает над этим, и он доступен как ранний доступ на их сайте).

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

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

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

3 голосов
/ 25 мая 2010

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

2 голосов
/ 25 мая 2010

Это анонимный класс, который (а) реализует интерфейс обработчика или (б) расширяет класс обработчика.

2 голосов
/ 25 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...