Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java事件和侦听器,错误的实现?_Java_Android_Events_Event Handling_Listener - Fatal编程技术网

java事件和侦听器,错误的实现?

java事件和侦听器,错误的实现?,java,android,events,event-handling,listener,Java,Android,Events,Event Handling,Listener,我目前正在根据下面发布的代码实现自定义事件和侦听器。我被告知这是一个非常肮脏的实现,需要改变。然而,我对java和android非常陌生,不知道当前的实现有什么问题我下面的方式很有效,似乎也在做我需要的一切。我想知道是否有人可以看一下我的代码,并就我应该更改什么以及我做错了什么提出一些建议。以我的示例为例,对其进行修改,以便我能够了解您所谈论的内容,我将不胜感激 提前谢谢 /* SmartApp.java */ public class SmartApp extends Activity {

我目前正在根据下面发布的代码实现自定义事件和侦听器。我被告知这是一个非常肮脏的实现,需要改变。然而,我对java和android非常陌生,不知道当前的实现有什么问题我下面的方式很有效,似乎也在做我需要的一切。我想知道是否有人可以看一下我的代码,并就我应该更改什么以及我做错了什么提出一些建议。以我的示例为例,对其进行修改,以便我能够了解您所谈论的内容,我将不胜感激

提前谢谢

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





下面是每个事件的事件对象。我在一个单独的文件中定义了这些,不确定这是否是一个好的过程

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


我不会说这是一个“非常肮脏的实现”。在我看来,使用回调/观察者/侦听器是一种很好的做法

当我编写安卓应用程序时,我喜欢将其分层,这样“应用程序”就是没有安卓导入的普通旧Java,理论上可以用于Swing应用程序、基于Java EE的网站等。“安卓”部分是严格的用户界面

我使用回调的目的是允许Android代码注册对应用程序中发生的事件的兴趣。例如,在21点游戏中,
活动
可能会调用
game.getDealer().playHand()
,通知应用程序执行经销商的手牌游戏逻辑。当该逻辑在应用程序中执行时,会触发事件,如
CardDrawed(card)
cardFlipped(card)
handTotalChanged(handTotal)
,等等。应用程序的Android部分会监听这些事件,并相应地在屏幕上重新绘制内容(但它对21点一无所知)

实际上,我只是让我的活动实现接口,如
CardListener
HandListener
,这样它们就可以直接接收事件(与您的方式不同),但您的风格并不一定是一种糟糕的方式。

我不会说这是一个“非常肮脏的实现”。在我看来,使用回调/观察者/侦听器是一种很好的做法

当我编写安卓应用程序时,我喜欢将其分层,这样“应用程序”就是没有安卓导入的普通旧Java,理论上可以用于Swing应用程序、基于Java EE的网站等。“安卓”部分是严格的用户界面

我使用回调的目的是允许Android代码注册对应用程序中发生的事件的兴趣。例如,在21点游戏中,
活动
可能会调用
game.getDealer().playHand()
,通知应用程序执行经销商的手牌游戏逻辑。当该逻辑在应用程序中执行时,会触发事件,如
CardDrawed(card)
cardFlipped(card)
handTotalChanged(handTotal)
,等等。应用程序的Android部分会监听这些事件,并相应地在屏幕上重新绘制内容(但它对21点一无所知)


实际上,我只是让我的活动实现一些接口,如
CardListener
HandListener
,等等。这样它们就可以直接接收事件(与您的方式不同),但您的风格并不一定是一种糟糕的方式。

我在理论上同意@SingleShot,对于您的Android应用程序中可能与Android无关的部分,只要所有间接层引入的开销不会使应用程序速度过慢。据我所知,在许多应用程序中,符合这一描述的应用相对较少

在另一篇文章中,您为一个活动与另一个活动进行通信提出了上述解决方案。在安卓系统中,活动不仅仅是一些Java对象,你可以随意丢弃它们。它们由操作系统管理,具有特定的生命周期。虽然观察者/可观察模式在某些地方非常令人愉快,但在观察者/可观察连接将产生垃圾收集问题的地方,它是不合适的。特别是,一个活动不能也不应该试图在另一个活动上保持某种侦听器接口

类似地,一个干净的观察者/可观察模式可能在面对数据库、线程、服务和其他Android现实时崩溃


所以,在纯Java代码中,从Android中分离出来,您所拥有的可能还可以。但是,不要到处推荐它作为Android特定问题的解决方案,除非你知道它可以解决这些Android特定问题。而且,当您开始尝试在Android应用程序中运行代码时,如果您在试图使教科书模式实现在Android应用程序的约束范围内运行时遇到问题,请不要感到震惊。

我在理论上同意@SingleShot,因为您的Android应用程序中可能存在与Android无关的部分,只要所有间接层引入的开销不会使应用程序速度过慢。据我所知,在许多应用程序中,符合这一描述的应用相对较少

在另一篇文章中,您为一个活动与另一个活动进行通信提出了上述解决方案。在安卓系统中,活动不仅仅是一些Java对象,你可以随意丢弃它们。它们由操作系统管理,具有特定的生命周期。虽然观察者/可观察模式在某些地方非常令人愉快,但在观察者/可观察连接将产生垃圾收集问题的地方,它是不合适的。特别是,一个活动不能也不应该试图在另一个活动上保持某种侦听器接口

类似地,一个干净的观察者/可观察模式可能在面对数据库、线程、服务和其他Android现实时崩溃

所以,在纯Java代码中,从Android中分离出来,您所拥有的可能还可以。然而,不要到处推荐它作为Android特定问题的解决方案,除非你知道它对tho有用
/* 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;
    }
}