首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java事件和侦听器,一个类中的多个事件

java事件和侦听器,一个类中的多个事件
EN

Stack Overflow用户
提问于 2011-02-06 02:25:09
回答 2查看 6.2K关注 0票数 4

我是android/java的新手,目前正在尝试学习定制事件和侦听器。我现在已经成功地实现了下面的代码。现在我想向DataRobot添加另一个事件。当使用analyzeData函数分析某一数据时,该事件将触发。我想知道是否有人能告诉我如何在这个类中实现两个事件?我使用这个事件触发一个AlarmDialog。所以,如果有更好的方法,请告诉我。

代码语言:javascript
复制
/* 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());
        }
    });
      }
}  

代码语言:javascript
复制
/* 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);
    }
}  

代码语言:javascript
复制
/* 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;
    }
}  

代码语言:javascript
复制
/* 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;
    }
}  
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-06 02:43:22

如何添加第二个事件取决于这两个事件是否相关。如果一个对象希望侦听这两个事件,那么它就像向您的DataAnalyzedListener接口添加另一个方法一样简单。

另一种情况是事件不相关,对象希望订阅一个事件或另一个事件。在这种情况下,您需要创建两个独立的接口,并有两个侦听器列表。

其他评论:

使用参数化列表而不是裸类型,您就不需要转换对象了。此外,您也可以使用foreach循环,而不是直接抓取迭代器。

代码语言:javascript
复制
private List<DataAnalyzedListener> _listeners = new ArrayList<DataAnalyzedListener>();

for (DataAnalyzedListener listener : _listeners) {
  listener.dataAnalyzedReceived(dRE);
}
票数 2
EN

Stack Overflow用户

发布于 2011-02-06 03:37:00

我会重新设计安卓系统。使用服务并注册它以接收具有特定动作类型的意图。用这样的方式来看:意图是你的事情。意图过滤器是您的意图映射,事件管理器是通过调用context.startActivity(意图)或广播意图(发布/订阅事件)来实现的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4911113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档