Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.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
android开发-使用android.os.Handler进行类间通信_Android_Architecture - Fatal编程技术网

android开发-使用android.os.Handler进行类间通信

android开发-使用android.os.Handler进行类间通信,android,architecture,Android,Architecture,作为android开发新手,我面临的一个难题是,我的类倾向于对gui监听器等的所有内部类进行扩展。所以我想出了一个分解我的类的解决方案,我想听听周围安卓专家的反馈 用一个例子来说明。我不想定义同一个类中某个特定活动的所有对话框(该活动中有一系列对话框) 因此,我实现了一个DialogManager类来定义和保存所有可能的对话框,将活动中的处理程序实例交给DialogManager,并使用它来通知活动发生了什么gui事件 这里是这个DialogManager类的一个片段,mHandler是调用活动

作为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文档在这方面做得很好,但我仍然错过了一本关于这方面的综合性书籍/资源