Java-события и слушатели, несколько событий в одном классе - PullRequest
4 голосов
/ 06 февраля 2011

Я новичок в Android / Java и в настоящее время пытаюсь узнать пользовательские события и слушателей. В настоящее время у меня есть этот код, реализованный ниже, который работает успешно. Теперь я хотел бы добавить еще одно событие в DataRobot. Событие сработает, когда определенный фрагмент данных будет проанализирован с помощью функции analysisData. Мне было интересно, если кто-то может показать мне, как реализовать два события в этом одном классе? Я использую это событие, чтобы вызвать AlarmDialog. Итак, если есть лучший способ, дайте мне знать.

/* SmartApp.java */
public class SmartApp extends Activity 
{
    private ConnectDevice cD = new ConnectDevice();
    private DataRobot dR = new DataRobot();
    private DataBuilder dB = new DataBuilder();
    private DataSender dS = new DataSender();
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.intro);

    cD.addDataReceivedListener(new DataReceivedListener() {
        @Override
        public void dataReceivedReceived(DataReceivedEvent event) {
            // TODO Auto-generated method stub
            dR.analyzeData(event.getData());
        }
    });
    dR.addDataAnalyzedListener(new DataAnalyzedListener() {
        @Override
        public void dataAnalyzedReceived(DataAnalyzedEvent event) {
            // TODO Auto-generated method stub
            dB.submitData(event.getData());
        }
    });
    dB.addDataBuilderListener(new DataBuilderListener() {
        @Override
        public void dataBuilderReceived(DataBuilderEvent event) {
            // TODO Auto-generated method stub
            dS.sendData(event.getData());
        }
    });
      }
}  

/* DataRobot.java */
public class DataRobot {
    /* This class is for analyzing the data */
    private List _listeners = new ArrayList();
    private String data;
    public boolean analyzeData(String temp) {
        /* Analyze the data
         * This function analyzes the data, as explained in the OP
         * This function fires the analyzed data event when finished
             * analyzing the data.
         */
        data = temp;
        fireDataAnalyzedEvent(data); // this fires the dataanalyzedevent
        return true; //for now this will always return true
    }

    public synchronized void addDataAnalyzedListener(DataAnalyzedListener listener) {
        _listeners.add(listener);
    }
    public synchronized void removeDataAnalyzedListener(DataAnalyzedListener listener) {
        _listeners.remove(listener);
    }
    private synchronized void fireDataAnalyzedEvent(String temp) {
        DataAnalyzedEvent dRE = new DataAnalyzedEvent(this, temp);
        Iterator listeners = _listeners.iterator();
        while(listeners.hasNext()) {
            ((DataAnalyzedListener)listeners.next()).dataAnalyzedReceived(dRE);
        }
    }
    public interface DataAnalyzedListener {
        public void dataAnalyzedReceived(DataAnalyzedEvent event);
    }
}  

/* DataReceivedEvent.java */
public class DataReceivedEvent extends EventObject{
    private String data;
    public DataReceivedEvent(Object source, String temp) {
        super(source);
        // TODO Auto-generated constructor stub
        data = temp;
    }
    public String getData() {
            // this function is just an accessor function
        return data;
    }
}  

/* DataAnalyzedEvent.java */
public class DataAnalyzedEvent extends EventObject{
    private String data;
    public DataAnalyzedEvent(Object source, String temp) {
        super(source);
        // TODO Auto-generated constructor stub
        data = temp;
    }
    public String getData() {
            // this function is just an accessor function
        return data;
    }
}  

Ответы [ 2 ]

3 голосов
/ 06 февраля 2011

Я бы изменил дизайн в Android. Используйте сервис и просто зарегистрируйте его, чтобы получать Интенты с определенными типами действий. Посмотрите на это так: намерение - это ваше событие. Фильтр намерений - это ваше сопоставление намерений, а менеджер событий - путем вызова context.startActivity (намерение) или трансляции намерения (события паба / подпрограммы), что в Android.

2 голосов
/ 06 февраля 2011

Способ добавления второго события зависит от того, связаны ли эти два события.Если объект захочет прослушать оба события, это так же просто, как добавить другой метод к вашему DataAnalyzedListener интерфейсу.

Другой случай, когда события не связаны, и объекты захотят подписаться наодно событие ИЛИ другое.В этом случае вы захотите создать два отдельных интерфейса и иметь два списка слушателей.

Другие комментарии:

Используйте параметризованный список вместо простого типа, и вы выигралине нужно кастовать объект.Также вы можете использовать цикл foreach вместо прямого захвата итератора.

private List<DataAnalyzedListener> _listeners = new ArrayList<DataAnalyzedListener>();

for (DataAnalyzedListener listener : _listeners) {
  listener.dataAnalyzedReceived(dRE);
}
...