Android: использование шаблона наблюдателя с представлениями (возможно, MVC, MVVM) - PullRequest
4 голосов
/ 12 июля 2011

Я провел несколько часов, читая различные вопросы и ответы, касающиеся реализации различных шаблонов MVC-типа в Android. Я видел несколько примеров кода, размещенных в различных блогах. Я, однако, все еще буду признателен за некоторые идеи и мнения о том, чего я пытаюсь достичь. В частности, я хотел бы разработать лучший механизм кода для информирования одного представления или группы представлений о том, что конкретный элемент данных был изменен.

Мое приложение довольно просто, которое получает данные измерений от аппаратного устройства через Bluetooth, а также отображает и регистрирует эти данные. В настоящее время у меня есть служба, которая заботится о связи Bluetooth и фоновой регистрации. У меня есть «глобальный» класс хранилища данных, который является расширением Application.

По мере того, как данные измерений опрашиваются с внешнего устройства, данные измерений (которые на самом деле составляют около тридцати байтов данных) обновляются в объекте хранилища данных (который, с точки зрения MVC, я предполагаю, является «моделью»). ).

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

Итак, чтобы добраться до сути, я пытаюсь выбрать лучший способ вызвать invalidate() для заинтересованных представлений при изменении данного элемента данных.

Возможны следующие варианты:

  1. Используйте существующий класс Observer и связанные с ним классы.

  2. В некотором роде «свернуть мой собственный» шаблон наблюдателя, создав собственные функции register () и unregister () в модели данных. Представления наблюдателей будут храниться в ArrayList (или, возможно, в более сложном расположении по одному списку наблюдателей на элемент данных). Я бы перебирал этот ArrayList каждый раз, когда данные обновлялись, и вызывал invalidate() (или, конечно, postInvalidate(), в зависимости от моего механизма потоков).

Есть ли причины, по которым я должен использовать одно из перечисленных выше над другим? И есть ли другой механизм «наблюдателя», который я должен рассмотреть?

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Многие представления в Android поддерживаются некоторым подклассом BaseAdapter, который имеет метод notifyDataSetChanged(), который инструктирует представление обновлять себя. Если вы используете представление (такое как ListView или GridView или любое потомство AdapterView), тогда оно поддерживается BaseAdapter и Вы можете просто обновить этот адаптер, и представление обновится само.

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

0 голосов
/ 20 июля 2018

Другим вариантом будет использование платформы Android Intent.При получении новых данных в сервисе установите данные для универсальной модели и передайте намерение, чтобы данные были обновлены с использованием метода Context.broadcastIntent (Intent).Любое представление, которое заинтересовано в этих данных, регистрирует и отменяет регистрацию получателей, используя методы Context.RegisterReceiver (Receiver) и Context.unregisterReceiver (Receiver).Оттуда представление извлекает данные из универсальной модели и соответственно обновляет представление.

Я думаю, что это может быть тем, что шаблон наблюдателя в пакете Android.Lifecycle.Observer делает за кадром.

...