java события, обработчики и вопрос слушателей - PullRequest
4 голосов
/ 27 января 2011

Редактировать: я действительно смог заставить это работать и сформировать, по моему мнению, хороший пример. Принятый ответ - мой пример, и вы можете оставлять комментарии, если вам нужна помощь или совет.

Я очень новичок в Java и только что познакомился с событиями, обработчиками и слушателями. Я нашел 3 хороших ссылки в Интернете, однако я все еще не понимаю, как я могу реализовать это, чтобы решить мою проблему. (Кроме того, это разрабатывается на Android. Я сомневаюсь, что это изменит пример, но думал, что я дам вам знать)

Ссылки на сайты, которые мне показались полезными:
счастливый объект
пример депо
java world

Вот что мне нужно, используя произвольные имена и примеры вместо того, чтобы выкладывать здесь сотни строк кода:

Вот мой класс и их использование:
MainUI - это создает пользовательский интерфейс
Connect - этот класс выполняет подключение к сокету и начинает получать данные
DataRobot - этот класс выполняет вычисления для полученных данных и решает, что с ними делать
DataBuilder - этот класс собирает данные от datarobot, и по достижении определенной суммы отправляет этот кусок в удаленную базу данных
DataSender - этот класс отправляет те данные, которые ему отправляет сборщик данных

Я реализовывал это с помощью потоков ... = (
Кто-то, кого я знаю, предложил мне использовать события. Он дал мне отличное объяснение, однако, это было в течение 30 минут, и я не понимаю, как я могу реализовать это, не увидев несколько лучших примеров (он также говорил из C # фона). Мне было интересно, может ли кто-нибудь с большим опытом работы в Java использовать то, что у меня есть выше, и показать мне, что мне нужно делать.

Вот события, которые я запланировал:
dataReceived - это событие происходит в соединении, это событие вызывается, когда соединение получает данные, когда оно запускается, оно отправляет данные в функцию обработчика роботов данных ().
dataAnalyzed - это событие происходит в datarobot, это событие возникает, когда datarobot завершает обработку данных, которые ему были переданы, когда это событие запускает, он отправляет данные в обработчик данных
dataBuilder - это событие происходит в databuilder, это событие возникает, когда databuilder получил определенную сумму и готов к отправке данных, когда это событие запускает, он отправляет данные в datasender.

Я ищу здесь пример или хотя бы обсуждение того, что должно быть сделано. Одним из примеров, которые я нашел, был пример "happyfaceobject", и он был довольно хорош. Тем не менее, у меня все еще есть проблемы с реализацией его в моем дизайне, так как я ОЧЕНЬ новичок в Java и событиях. Пожалуйста, помогите мне, когда вы можете, и это будет высоко ценится. Этот пример также поможет сообществу в целом, так как не хватает примеров великолепных событий Java.

Заранее спасибо, если вам нужна дополнительная информация, дайте мне знать.

Ответы [ 2 ]

6 голосов
/ 27 января 2011

Вы очень новичок в Java - я думаю, вы слишком усложняете это и пытаетесь проглотить слишком много сразу.

Забудьте о своем великолепном дизайне.Забудьте об интерфейсе.Забудьте об Android.

Начните с проблемы с игрушкой и создайте ее.

Можете ли вы создать один класс Listener, который отвечает на событие, и класс производителя, чтобы отправить это событие?Можете ли вы увидеть действие?Если вы не можете сделать это, вы не уйдете далеко.Когда у вас есть одна работа, переходите к следующей и посмотрите, сможете ли вы заставить свой проект работать с этими более простыми объектами.Только когда все работает, вы должны беспокоиться о связывании элементов Android и UI.

Начните с простых моделей POJO, и вы станете еще быстрее.

1 голос
/ 30 января 2011

У меня это работает, и это, кажется, отличный пример. Я выложу код ниже, надеюсь, он поможет кому-нибудь когда-нибудь! = D ПОЖАЛУЙСТА, если вы видите, что я сделал что-то не так, или знаете лучший способ, оставьте несколько комментариев, чтобы я мог исправить это. Спасибо

В основном для каждого события, которое вы хотите создать, необходим Объект события , Интерфейс прослушивателя , Функция AddListener , Функция RemoveListener , FireEvent Function и Listeners . Все это можно увидеть в примерах ниже. Если у вас есть какие-либо вопросы, пожалуйста, пишите в комментариях, и если это поможет вам, не стесняйтесь upvote! = Р

/* 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());
        }
    });
      }
}  

/* ConnectDevice.java
 * This class is implementing runnable because i have a thread running that is checking
 * the contents of a socket. Irrelevant to events. */
public class ConnectDevice implements Runnable {

    private List _listeners = new ArrayList();
    private String data;

    /* Constructor */
    public ConnectDevice() {// does some socket stuff here, irrelevant to the events}
    public void run() {// does some socket stuff here, irrelevant to the events}

    public synchronized void addDataReceivedListener(DataReceivedListener listener) {
        _listeners.add(listener);
    }
    public synchronized void removeDataReceivedListener(DataReceivedListener listener) {
        _listeners.remove(listener);
    }
    private synchronized void fireDataReceivedEvent(String temp) {
        DataReceivedEvent dRE = new DataReceivedEvent(this, temp);
        Iterator listeners = _listeners.iterator();
        while(listeners.hasNext()) {
            ((DataReceivedListener)listeners.next()).dataReceivedReceived(dRE);
        }
    }
    public interface DataReceivedListener {
        public void dataReceivedReceived(DataReceivedEvent event);
    }
}  

/* 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);
    }
}  

/* DataBuilder.java */
public class DataBuilder {
    private List _listeners = new ArrayList();
    private String data;
    public boolean submitData(String temp) {
            /* Builds the data
             * This function builds the data, as explained in the OP
             * This function fires the databuilder data event when finished
                     * building the data.
             */
        data = temp;
        fireDataBuilderEvent(data); //firing the databuilder event when finished
        return true;
    }
    public synchronized void addDataBuilderListener(DataBuilderListener listener) {
        _listeners.add(listener);
    }
    public synchronized void removeDataBuilderListener(DataBuilderListener listener) {
        _listeners.remove(listener);
    }
    private synchronized void fireDataBuilderEvent(String temp) {
        DataBuilderEvent dRE = new DataBuilderEvent(this, temp);
        Iterator listeners = _listeners.iterator();
        while(listeners.hasNext()) {
            ((DataBuilderListener)listeners.next()).dataBuilderReceived(dRE);
        }
    }
    public interface DataBuilderListener {
        public void dataBuilderReceived(DataBuilderEvent event);
    }
}  

/* DataSender.java */
/* this class has no event, because it is done firing events at this point */
public class DataSender {
    private String data;
    public boolean sendData(String temp) {
        data = temp;
        return true;
    }
}  

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

/* 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;
    }
}  

/* DataBuilderEvent.java */
public class DataBuilderEvent extends EventObject {
    private String data;
    public DataBuilderEvent(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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...