android开发-使用android.os.Handler进行类间通信
作为android开发新手,我面临的一个难题是,我的类倾向于对gui监听器等的所有内部类进行扩展。所以我想出了一个分解我的类的解决方案,我想听听周围安卓专家的反馈 用一个例子来说明。我不想定义同一个类中某个特定活动的所有对话框(该活动中有一系列对话框) 因此,我实现了一个DialogManager类来定义和保存所有可能的对话框,将活动中的处理程序实例交给DialogManager,并使用它来通知活动发生了什么gui事件 这里是这个DialogManager类的一个片段,mHandler是调用活动的处理程序android开发-使用android.os.Handler进行类间通信,android,architecture,Android,Architecture,作为android开发新手,我面临的一个难题是,我的类倾向于对gui监听器等的所有内部类进行扩展。所以我想出了一个分解我的类的解决方案,我想听听周围安卓专家的反馈 用一个例子来说明。我不想定义同一个类中某个特定活动的所有对话框(该活动中有一系列对话框) 因此,我实现了一个DialogManager类来定义和保存所有可能的对话框,将活动中的处理程序实例交给DialogManager,并使用它来通知活动发生了什么gui事件 这里是这个DialogManager类的一个片段,mHandler是调用活动
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不是正确的方法
下一个想法就像在给定的示例中定义一个接口一样简单
public interface DialogEventReceiverInterface {
public void dialogEvent(int dialog,int button);
}
在活动中实现该接口,将活动移交给DialogManager,并在事件发生时调用dialogEvent。我现在觉得很直截了当 这可能不是你想要的100%,但它可以解决你在Android应用程序中遇到的问题 通常我会有很多内部类侦听器,当处理很多UI事件时,另一个选项是发布-订阅。发布事件和订阅特定事件的对象的位置。在安卓系统中,谷歌有一套很好的库,他们用它命名为
Guava
,它有很多很棒的东西。其中一个是EventBus
,它使这变得更容易
他们有一些很好的例子在那里,并带你通过它。这是一个很大的变化,也是一种不同的思维方式,所以我不会不进行调查就直接介入。确保它适合您的项目
EventBus很酷,
Guava
库中有很多很好的功能。我很感激你没有必要特别询问清理与对话框相关的混乱,但是,您显示的对话框
代码只是一个更广泛问题的说明,我认为您需要一个设计模式来解决
然而,专注于您的Dialog
s的具体示例,Android API现在已经以Fragment
s的形式提供了一个更干净的解决方案,特别是DialogFragment
。使用Fragment
类是一种更干净的方法,因为您通常在单独的类文件中定义对话框Fragment
s。Android API文档包含了关于如何处理对话框片段
s和父活动
之间的通信的非常好的指导原则
在我开始使用Fragment
s之前,我也在Activity
类中创建了大量的Dialog
s,并尝试了各种对话框管理器设计模式等。然而,在我看来,Fragment
方法更干净
与早期Android版本的兼容性没有问题,因为您可以使用V4支持包 由于处理程序消息不会立即执行,而是添加到任务队列中,所以您可能会遇到以下情况:例如,发送两条后续“关闭”消息。如果用户在“取消”按钮上快速单击两下,就会出现这种情况。如果这不会导致任何问题,那么您必须考虑可能出现的问题,然后编写代码,这并不好。非常感谢boulder,这听起来像是反对这种方法的致命论据。我想我应该选择我的问题中简单提到的接口解决方案。再次感谢。谢谢xbakesx,看起来像一个很棒的图书馆。。现在,我选择了我刚刚添加到初始问题中的界面解决方案(如果也没有人反驳这个想法的话),但对于更复杂的场景,番石榴将出现在我的脑海中。谢谢汉克·特雷弗。事实上,我还没有真正研究过这些片段,但你提到的听起来很有希望。对于我当前的应用程序(我的第一个),我将坚持这种非碎片方法,但你的回答肯定会激励我尽快使用碎片。非常感谢。顺便说一句,你是对的,我现在的整个方法是在android框架内寻找设计模式/最佳实践。android文档在这方面做得很好,但我仍然错过了一本关于这方面的综合性书籍/资源