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