Статьи

Совет: как использовать библиотеку EventBus

Конечный продукт
Что вы будете создавать

Создание приложения для Android с несколькими активными компонентами, взаимодействующими друг с другом, может быть утомительным. Чтобы сэкономить время, разработчики часто используют тесно связанные компоненты в своих приложениях. EventBus — это популярная библиотека с открытым исходным кодом, созданная для решения этой проблемы с использованием шаблона издатель / подписчик .

Используя библиотеку EventBus, вы можете передавать сообщения из одного класса в один или несколько классов всего за несколько строк кода. Более того, все участвующие классы полностью отделены друг от друга, что приводит к тому, что код становится менее сложным, а его легче поддерживать и отлаживать.

В этом кратком совете вы узнаете, как использовать библиотеку EventBus, создав простое приложение для Android, отображающее состояние зарядки устройства. Поскольку изменения в статусе начисления платы являются системными событиями, приложение будет иметь Activity которая должна получать информацию от BroadcastReceiver — идеальный сценарий для использования шины событий.

Убедитесь, что у вас установлена ​​Eclipse ADT Bundle. Вы можете скачать его с сайта разработчика Android .

Запустите Eclipse и создайте новое приложение для Android. Назовите приложение EventBusSample . Выберите уникальное имя пакета и установите Минимальный необходимый SDK для Android 2.2 и Target SDK для Android 4.4 .

Создать новое приложение для Android

Мы собираемся создать действие самостоятельно, поэтому отмените выбор « Создать действие» и нажмите « Готово» .

Снимите флажок «Создать действие» и нажмите «Готово».

Это приложение имеет один BroadcastReceiver который отвечает на следующие действия:

  • android.intent.action.ACTION_POWER_CONNECTED
  • android.intent.action.ACTION_POWER_DISCONNECTED

Назовите BroadcastReceiver ChargingReceiver и объявите его в файле AndroidManifest.xml .

1
2
3
4
5
6
<receiver android:name=».ChargingReceiver»>
    <intent-filter>
        <action android:name=»android.intent.action.ACTION_POWER_CONNECTED» />
        <action android:name=»android.intent.action.ACTION_POWER_DISCONNECTED» />
    </intent-filter>
</receiver>

Приложение имеет одну Activity для отображения статуса зарядки. Назовите его DisplayActivity и объявите его, как показано ниже.

1
2
3
4
5
6
<activity android:name=».DisplayActivity»>
    <intent-filter>
        <action android:name=»android.intent.action.MAIN»/>
        <category android:name=»android.intent.category.LAUNCHER» />
    </intent-filter>
</activity>

Загрузите последнюю версию библиотеки EventBus в виде JAR из Maven Central и добавьте JAR в каталог libs вашего проекта.

События на шине событий — это не что иное, как объекты, содержащие информацию, которая должна быть передана. Пусть ChargingEvent будет именем класса, который содержит информацию, переданную из BroadcastReceiver в Activity . Это простой класс, который имеет только String для представления информации. Он также имеет конструктор для установки значения строки и метод доступа для получения ее значения.

Создайте новый файл с именем ChargingEvent.java и добавьте в него следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
package com.hathy.eventbussample;
 
public class ChargingEvent {
    private String data;
     
    public ChargingEvent(String data){
        this.data = data;
    }
     
    public String getData(){
        return data;
    }
}

Создайте новый класс с именем ChargingReceiver который расширяет BroadcastReceiver . Этот класс использует шину событий для публикации сообщений. У него есть переменная с именем bus , которая ссылается на шину, созданную библиотекой EventBus. Шина является одиночной, и вы должны использовать метод getDefault чтобы обратиться к ней.

В методе onReceive мы создаем новый экземпляр класса ChargingEvent и добавляем в него наше сообщение. Вот пример сообщения:

1
@14:23:20 this device started charging.

Чтобы сгенерировать это сообщение, нам нужно сделать следующее:

  • Используйте методы, доступные в классе Time чтобы установить время, когда произошло событие.
  • Добавьте строку «это устройство начало заряжать | разряжать» в зависимости от полученного действия. Если получено действие Intent.ACTION_POWER_CONNECTED , устройство заряжается. Если это Intent.ACTION_POWER_DISCONNECTED , устройство разряжается.

Как только объект ChargingEvent получает правильную информацию, он публикуется на шине событий с использованием метода post . Реализация класса ChargingReceiver теперь должна выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.hathy.eventbussample;
 
import de.greenrobot.event.EventBus;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.format.Time;
 
public class ChargingReceiver extends BroadcastReceiver {
 
    private EventBus bus = EventBus.getDefault();
     
    @Override
    public void onReceive(Context context, Intent intent) {
        ChargingEvent event = null;
         
        // Get current time
        Time now = new Time();
        now.setToNow();
        String timeOfEvent = now.format(«%H:%M:%S»);
         
        String eventData = «@» + timeOfEvent + » this device started «;
        if(intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)){
            event=new ChargingEvent(eventData+»charging.»);
        } else if(intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)){
            event=new ChargingEvent(eventData+»discharging.»);
        }
         
        // Post the event
        bus.post(event);
    }
 
}

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

Создайте новый класс с именем DisplayActivity . Этот класс отвечает за отображение сообщений о событиях, опубликованных на шине событий.

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

Чтобы позволить классу подписаться на события на шине, вызывается метод register . В нашей Activity мы вызываем это в методе onCreate .

Аналогично, для прекращения получения событий вызывается метод unregister . Мы вызываем этот метод в методе onDestroy чтобы убедиться, что все ресурсы освобождены.

Действие имеет очень простой макет, содержащий только TextView который отображает сообщения. Поэтому нет необходимости создавать макет для него. Мы просто используем TextView как представление содержимого Activity .

На этом этапе реализация класса DisplayActivity должна выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.hathy.eventbussample;
 
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import de.greenrobot.event.EventBus;
 
public class DisplayActivity extends Activity {
     
    private EventBus bus = EventBus.getDefault();
     
    private TextView view;
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         
        view = new TextView(this);
 
        view.setTextSize(20f);
        view.setPadding(20, 20, 20, 20);
        view.setText(«Waiting for events…»);
         
        setContentView(view);
 
        // Register as a subscriber
        bus.register(this);
    }
     
    @Override
    protected void onDestroy() {
        // Unregister
        bus.unregister(this);
        super.onDestroy();
    }
 
}

Каждый класс, который намеревается получать события из шины событий, должен содержать метод onEvent . Имя этого метода важно, потому что библиотека EventBus использует Java Reflection API для доступа к этому методу. У него есть один параметр, который относится к событию. В нашем случае параметр будет иметь тип ChargingEvent .

Все, что мы делаем в этом методе — добавляем последнее полученное сообщение к содержимому TextView . Реализация метода onEvent выглядит следующим образом:

1
2
3
public void onEvent(ChargingEvent event){
    view.setText(view.getText() + «\n» + event.getData());
}

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

В этом руководстве вы узнали, как использовать библиотеку EventBus и насколько она упрощает взаимодействие между классами. Библиотека оптимизирована для платформы Android и очень легкая. Это означает, что вы можете использовать его в своих проектах, не беспокоясь о размере вашего приложения. Чтобы узнать больше о библиотеке EventBus, посетите проект на GitHub .