我作为Android开发新手的一个挣扎是我的课程倾向于使用gui监听器等所有内部类等相当广泛。所以我提出了一个分解我的课程的解决方案,我想听听安卓专家的一些反馈。
把它放到一个例子中。我不想定义特定Activity在同一个类中的所有对话框(该活动中发生了一系列对话) 所以我实现了一个DialogManager类来定义和保存所有潜在的Dialog,将一个处理程序实例从Activity移交给这个DialogManager,并使用它来通知Activity有关发生了什么gui事件。
这里是这个DialogManager类的片段,mHandler是回调Activity的处理程序
mDownloadDialog = new ProgressDialog(mContext);
mDownloadDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mDownloadDialog.dismiss();
Message message = mHandler.obtainMessage();
message.arg1 = DOWNLOAD_DIALOG;
message.arg2 = AlertDialog.BUTTON_NEGATIVE;
message.sendToTarget();
}
});
所以这很有效,我对现在更有条理的源代码感到满意,但是我想知道Handler类是否是正确的方法,或者这是否有点矫枉过正,有一些更好的方法来实现相同的推荐的结果。
编辑: 正如博尔德指出的那样
处理程序消息不会立即执行
因此,考虑到这一点,使用Handler并不是正确的方法。
下一个想法就像在给定示例中定义接口
一样简单public interface DialogEventReceiverInterface {
public void dialogEvent(int dialog,int button);
}
在Activity中实现该接口,将活动交给DialogManager,并在发生事件时调用dialogEvent。相当直接,现在在我看来......
答案 0 :(得分:1)
这可能不是您正在寻找的100%,但它可能会解决您在Android应用中遇到的问题。
我经常会遇到很多内部类侦听器,例如在处理大量UI事件时,另一个选择是发布 - 订阅。您发布事件和对象的位置订阅特定事件。在Android中,谷歌拥有一套他们使用的名为Guava
的甜蜜图书馆,这些图书馆有很多优秀的东西。其中一个是EventBus
,这使得这更容易。
http://code.google.com/p/guava-libraries/wiki/EventBusExplained
他们在那里有一些很好的例子并引导你完成它。这是一个很大的改变,也是一种不同的思维方式,所以我不会在没有调查的情况下跳进去。确保它适合您的项目。
EventBus很酷,Guava
库中有很多很棒的功能。
答案 1 :(得分:1)
我很欣赏你不一定要专门询问整理与Dialog
相关的混乱,而是你展示的Dialog
代码只是我想你的一个更广泛问题的例证。要求设计模式来解决。
但是,专注于Dialog
的具体示例,Android API现在已经以Fragment
s和DialogFragment
的形式为此提供了更清晰的解决方案。使用Fragment
类是一种更简洁的方法,因为您通常在单独的类文件中定义DialogFragment
。 Android API文档包含有关如何处理DialogFragment
和父Activity
之间通信的非常好的指南。
在我切换到使用Fragment
s之前,我最终在Dialog
个类中创建了很多Activity
个,我尝试了各种设计模式和对话管理器等等但是,在我看来,Fragment
方法更加清晰。
与早期Android版本的兼容性没有问题,因为您可以使用V4支持包。